01背包
#include <iostream>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N];
int main(){
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]<<endl;
return 0;
}
完全背包
#include <iostream>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N];
int main(){
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=v[i];j<=m;j++) //因为是下一层的值,所以不需要倒序
f[j]=max(f[j],f[j-v[i]]+w[i]);
//f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]); 去掉i
/*f[i][j] =(f[i-1][j],f[i-1][j-v]+w,f[i-1][j-2v]+2w,f[i-1][j-3v]+3w···,f[i-1][j-kv]+kw+f[i-1][j-(k+1)]+(k+1)w)
f[i][j-v]=(f[i-1][j-v],f[i-1][j-2v]+w,f[i-1][j-3v]+2w,···,f[i-1][j-(k+1)v]+kw)
将第一个式子的j换成j-v再代入可发现 后面的部分可以写为 f[i][j-v]+w*/
cout<<f[m]<<endl;
return 0;
}