动态规划的引入 P1048 采药【01背包】
题目
https://www.luogu.com.cn/problem/P1048
题目分析
代码
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int f[1001], v[200], w[200]; int main() { int t, m; scanf("%d%d", &t, &m); for (int i = 1; i <= m; i++) scanf("%d%d", &w[i], &v[i]); for (int i = 1; i <= m ; i++) for (int j = t; j >= w[i]; j--) f[j] = max(f[j], f[j - w[i]] + v[i]); printf("%d", f[t]); }
注意事项
f【i】数组的概念是当背包的容量是i的时候能获得的最大价值,所以i的范围是数字t的范围
for (int i = 1; i <= m ; i++):一共m个物品,我们分别判断每个物品取或者不取的情况
for (int j = t; j >= w[i]; j--):当背包的容量在w【i】~t的范围才能有选择是不是要装该物品(f[j] = max(f[j], f[j - w[i]] + v[i]);装不装哪个价值大),如果不在该范围的话就一定不能装入