动态规划 完全背包问题
完全背包问题与简单背包问题最为明显的区别就是,每件物品可以无限次使用,也就是说,你的背包可以只装这一件物品
下面附上题解
/* f[g] 代表当背包空间为g的时候,背包的最大价值 result = max( f[1] ... f[g]) */ #include <iostream> using namespace std; const int N = 1010; int main() { int f[N] = { 0 }; int V[N] = { 0 }; int W[N] = { 0 }; int n = 0; int v = 0; cin >> n >> v; for (int i = 1; i <= n; i++) { cin >> V[i] >> W[i]; } for (int i = 1; i <= n; i++) { for (int j = V[i]; j <= v; j++) { f[j] = max(f[j], f[j - V[i]] + W[i]); } } int Max = 0; for (int i = 0; i <= v; i++) { Max = max(Max, f[i]); } cout << Max; }
for (int i = 1; i <= n; i++) { for (int j = V[i]; j <= v; j++) { f[j] = max(f[j], f[j - V[i]] + W[i]); } }
阅读代码我们会发现,其与简单背包问题的代码区别只是在第二重for循环中,
将j也就是空间从小到大遍历,我们简单背包问题之所以是从后往前遍历,
是因为我们要用的之前还没有被更新的数据,也就是i-1个物品在j容量下的最大价值此时,
i-1是不包括 i 这个当前物品的,
也就满足了简单背包问题只能取一次物品的条件而当你从小到大遍历j时,那么你的f[j - V[i]]便是包括了 i 物品在内的最大价值,
也就满足了题目的条件