成魔之路−> 算法提高课题解
结论: f[i][j]=max
思路:
-
1. 状态表示
集合:从前\ i\ 个物品中选,体积不超过\ j\ 的价值
属性:\max -
2. 状态转移
不选第\ i\ 个物品:f[i-1][j]
选择第\ i\ 个物品:f[i-1][j-v[i]]+w[i] -
3. 滚动数组
由于\ f[i][j]\ 只需用到当前层和上一层,则结论可转化为:f[j]=\max(f[j],\ f[j-v[i]]+w[i])
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,m;
int f[N];
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++)
{
int v,w;
cin>>v>>w;
for(int j=m;j>=v;j--) f[j]=max(f[j],f[j-v]+w);
}
cout<<f[m]<<endl;
return 0;
}