[ACW]01背包问题
tips:
1.状态表示f(i,j):集合:(所有选法;条件);属性(max,min,数量)
2.状态计算,集合划分:不重不漏
3.隐含在符号,记号之后的内涵,表示的问题
Q:fij的j不能从j=v[i]开始取进行计算,j从它上面和左前计算过来,左前不存在,还有上面存在。
/*
#include<iostream>
using namespace std;
const int maxn=1010;
int n,m;
int v[maxn],w[maxn];
int f[maxn][maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
//全局变量默认是0
// for(int j=0;j<=v;j++){
// f[0][j]=0;
// }
for(int i=1;i<=n;i++){
for(int j=v[i];j<=m;j++){//这里错误的解释??
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
}
}
cout<<f[n][m]<<endl;
return 0;
}
*/
#include<iostream>
using namespace std;
const int maxn=1010;
int n,m;
int v[maxn],w[maxn];
int f[maxn][maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
//全局变量默认是0
// for(int j=0;j<=v;j++){
// f[0][j]=0;
// }
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=v[i])
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
}
}
cout<<f[n][m]<<endl;
return 0;
}