AcWing 2. 01背包问题
原题链接
简单
作者:
阿飞被注册了
,
2021-05-27 19:58:52
,
所有人可见
,
阅读 307
row-25:f[i][j]由 f[i-1][j], f[i-1][f-v[i]] 构成。
f[i-1][j]:不包含物品i的最大价值–从前i-1个东西中放入空间为j的背包的最大价值
f[i-1][j-v[i]]:包含物品i的最大价值–从前i-1个东西中放入空间为j-v[i]的背包的最大价值(曲线救国!)
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int v[2000], w[2000];
int f[2000];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> v[i] >> w[i];
for(int i = 1; i <= n; i++)
for(int j = m; j >= v[i]; j--)
{
//是将上层的(i-1)f[j], 赋值给这层(i)的f[i]即:f[i][j] = f[i-1][j];
f[j] = f[j];
//f[i][j] = f[i-1][j];
//由于j > j-v[i] 所以是这层的f[j-v[i]]赋值给这层的f[i]即:f[i][j] = f[i][j-v[i]]但是与下面的f[i][j] = f[i-1][j-v[i]]不一致,所以第二层循环从后向前遍历就可以避免该问题。
f[j] = max(f[j], f[j-v[i]] + w[i]);
//f[i][j] = max(f[i-1][j], f[i-1][j-v[i]] + w[i]);
}
cout << f[m];
return 0;
}
orz