一、例题
二、算法思路
对于循环j从大到小循环的解释:
初始方程:f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]),
当前f[i][j]状态的改变依赖于上一层原有状态,而我们目前想用一位数组来优化,呢么还是要保持原有变换规则。
即f[j]状态,(这里要清楚,为啥是f[j],而不是f[i],因为在f[i][j]中i仅决定哪一层的f[j]值。)
若j从v[i]-m,则方程f[j]=max(f[j],f[j-v[i]]+w[i]),会覆盖原有初始值。
三、题解代码
#include <iostream>
using namespace std;
const int N=1010;
int f[N];
int v[N],w[N];
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--)//对于循环从大到小循环的解释:
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
cout<<f[m];
return 0;
}