int main(){
int n,m;
int result[100][100];
int weight[100],value[100],amount[100];
int newweight[100],newvalue[100];
scanf("%d%d",&n,&m);
int number=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&weight[i],&value[i],&amount[i]);
//将同一种类物品分割成不同物品然后按照01背包解决
for(int j=1;j<=amount[i];j=j*2){
number++;
newweight[number]=weight[i]*j;
newvalue[number]=value[i]*j;
amount[i]=amount[i]-j;
}
if(amount[i]>0){
number++;
newweight[number]=weight[i]*amount[i];
newvalue[number]=value[i]*amount[i];
}
}
for(int i=0;i<=number;i++){
result[i][0]=0;
}
for(int j=0;j<=m;j++){
result[0][j]=0;
}
for(int i=1;i<=number;i++){
for(int j=1;j<=m;j++){
if(j<newweight[i]){
result[i][j]=result[i-1][j];
}else{
result[i][j]=max(result[i-1][j],result[i-1][j-newweight[i]]+newvalue[i]);
}
}
}
cout<<result[number][m];
return 0;
}
多重背包
最新推荐文章于 2024-09-28 22:05:59 发布