题解:P1048 [NOIP2005 普及组] 采药
思路
经典 01背包 问题。观察到题目中含有「时间」与「价值」字样,考虑使用 背包 求解。
定义
其中,
显见最后输出结果为
时间复杂度为
实现
# include <iostream>
using namespace std;
int w[1145],c[1145],f[1145][1145];
int main(){
int n,m; cin >> m >> n;
for (int i = 1;i <= n;i++) cin >> w[i] >> c[i];
for (int i = 1;i <= n;i++){
for (int v = m;v > 0;v--){
if (w[i] <= v) f[i][v] = max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
else f[i][v] = f[i-1][v];
}
}cout << f[n][m];
return 0;
}