区别:
01背包问题:
有 N 件物品和一个容量是V的背包,每件物品只能使用一次。
第 i 件物品的体积是 vi 价值是 wi 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
二维:
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (v[i]<=j)
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
else
f[i][j]=f[i-1][j];
}
一维:
for (int i=1;i<=n;i++)
for (int j=m;v[i]<=j;j--)//逆序防止数据污染
h[j]=max(h[j],h[j-v[i]]+w[i]);
完全背包问题:
有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
二维:
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (v[i]<=j)
f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
else
f[i][j]=f[i-1][j];
}
一维:
for (int i=1;i<=n;i++)
for (int j=v[i];j<=m;j++)//正序
h[j]=max(h[j],h[j-v[i]]+w[i]);
多重背包问题:
有 N 种物品和一个容量是 V 的背包。
第 i 种物品最多有 si 件,每件体积是 vi ,价值是 wi 。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=0;k<=s[i]&&k*v[i]<=j;k++)
f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
分组背包问题:
有 N 组物品和一个容量是 V 的背包。
每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij ,价值是 wij ,其中 i 是组号,j 是组内编号。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。
输出最大价值。
二维:
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
f[i][j]=f[i-1][j];
for (int k=1;k<=s[i];k++)
{
if (v[i][k]<=j)
f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
}
}