混合背包求问
作者:
comum
,
2024-05-28 23:53:18
,
所有人可见
,
阅读 9
为什么不优化一维要错,11/17
同样的代码优化了就能过
#include<iostream>
using namespace std;
const int N = 201000;
int f[1010][1010];
int n,m;
int a[N],b[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int v,w,s;
cin>>v>>w>>s;
if(s==0){ //完全
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=v)f[i][j]=max(f[i][j],f[i][j-v]+w);
}
}
else{
if(s==-1){ //01
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=v)f[i][j]=max(f[i][j],f[i-1][j-v]+w);
}
}
else{ //多重
for(int k=1;k<=s;k*=2){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=k*v)f[i][j]=max(f[i][j],f[i-1][j-k*v]+k*w);
}
s-=k;
}
if(s){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=s*v)f[i][j]=max(f[i][j],f[i-1][j-s*v]+s*w);
}
}
}
}
//cout<<f[i][m]<<endl;
}
cout<<f[n][m]<<endl;
return 0;
}