//完全背包 :第i取无限件
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
//01背包 :取一件
//正常
for( int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
else dp[i][j]=dp[i-1][j];
}
}
//滚动数组
int p=1,q=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j<w[i])f[p][j]=f[q][j];
else f[p][j]=max(f[q][j],f[q][j-w[i]]+v[i]);
}
swap(q.p);
}
//一维数组
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];--j)
f[j]=max(f[j],f[j-w[i]]+v[i]);
//多重背包
int n=0;
cin>>n0>>m;
for(int i=1;i<=n0;i++)
{
cin>>vv>>ww>>cc;
for(int j=1;j>=cc;j*=2)
{
v[++n]=vv*j;
w[n]=ww*j;
cc-=j;
}
if(cc)
{
v[++n]=vv*cc;
w[n]=ww*cc;
}
}//其实就是合成出新的物品,其中所装原物品的数量为,1,2,4,8,用二进制列出所有的数;转化为01背包问题
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
//混合背包是转化为多重背包问题
//二维背包 阔怕
//组合背包,
vector<int>g[maxn];//分组
for(i:1~组数)
for(j:最大容量~0)
for(ii:0<每组含的物品)
k:g[i][ii]
if(w[k]<=j)f[j]=max(f[j],f[j-w[k]]+v[k])
背包汇总
最新推荐文章于 2023-12-24 15:48:09 发布