我用二进制优化+二维的01背包来写,在acwing上面的那道多重背包模板题样例都过不了,下面是二维01背包的代码
#include<iostream>
#include<cmath>
using namespace std;
int f[10000][20000],sb[12100],cb[12100],wb[12100];
int n,v,cnt,s,c,w;
int main()
{
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>c>>w>>s;
int k=1;
while(k<=s)
{
cnt++;
cb[cnt]=k*c,wb[cnt]=k*w;
s-=k;
k*=2;
}
if(s>0){
cnt++;
cb[cnt]=c*s,wb[cnt]=w*s;
}
}
n=cnt;
for(int i=1;i<=n;i++)
for(int j=v;j>=cb[i];j--)
f[i][j]=max(f[i-1][j],f[i-1][j-cb[i]]+wb[i]);
cout<<f[n][v]<<endl;
return 0;
}
但是将二维01背包压缩成一维之后就AC了,我十分不理解,希望有大佬能帮帮我,下面是代码
#include<iostream>
#include<cmath>
using namespace std;
int f[21000],sb[12100],cb[12100],wb[12100];
int n,v,cnt,s,c,w;
int main()
{
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>c>>w>>s;
int k=1;
while(k<=s)
{
cnt++;
cb[cnt]=k*c,wb[cnt]=k*w;
s-=k;
k*=2;
}
if(s>0){
cnt++;
cb[cnt]=c*s,wb[cnt]=w*s;
}
}
n=cnt;
for(int i=1;i<=n;i++)
for(int j=v;j>=cb[i];j--)
f[j]=max(f[j],f[j-cb[i]]+wb[i]);
cout<<f[v]<<endl;
return 0;
}
如果有大佬帮到我了,我会成为您的一枚粉丝