揹包
01 揹包
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]);
ans=max(ans,f[j]);
}
完全揹包
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]);
ans=max(ans,f[j]);
}
多重揹包
for(int i=1;i<=nt;i++)
{
int vt,wt,st; scanf("%d%d%d",&vt,&wt,&st);
int k=0;
while(k<=st)
{
v[++n]=vt<<k;
w[n]=wt<<k;
st-=1<<k;
k++;
}
if(st)
{
v[++n]=vt+st;
w[n]=wt*st;
}
}
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]);
ans=max(ans,f[j]);
}
分組揹包
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=s[i];k++)
if(j>=v]i)[k] f[j]=max(f[j],f[j-v[i][k]]+w[i]);