f[i][j] = max(f[i-1][j],f[i-1][j-v[i]]+w[i])
先看一下题目:
下面是这个题通过的代码:
#include <iostream>
using namespace std;
const int N = 1010;
int f[N][N];
int n,m;
int v,w;
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> v >> w;
for(int j = 1;j <=m;j++)
{
f[i][j] = f[i-1][j];
if(j>=v)
{
f[i][j] = max(f[i][j],f[i-1][j-v]+w);
}
}
}
cout << f[n][m] << endl;
return 0;
}
接下来是一个优化,把二维的优化为一维的:
for(int j = 1;j <=m;j++)
{
f[i][j] = f[i-1][j];
if(j>=v)
{
f[i][j] = max(f[i][j],f[i-1][j-v]+w);
}
}
for(int j = v;j<=m;j++)
{
// 这样我们就可以直接写成
f[i][j] = f[i-1][j];
f[i][j] = max(f[i][j],f[i-1][j-v] + w)
}
// 我们用g[N] 来表示
for(int j = v;j<=m;j++)
{
g[j] = g[j]
// 但是这个时候f[j-v]+w,是第i层的j,此时f[j-v]是已经被计算过的了
f[j] = max(f[j],f[j-v]+w)
}
for(int j = m;j>=v;j--)
{
// 所以我们从大到小开始计算,这样我们在计算f[j-v]的时候就是没有被计算过的了的
f[j] = max(f[j],f[j-v]+w)
}