第七单元 背包专题 7.1部分背包问题 与 7.2 0/1 背包问题

第七单元 背包专题

这个整理了好久,求谅解,谢谢

7.1 部分背包问题

参见 “4.1 装载问题”。部分背包问题是贪心算法问题,其他背包问题都是动态规划问题。

 7.2 0/1 背包问题!

【问题描述】有 n 件物品和一个容量为 C 的背包。第 i 件物品的重量是 w[i],价值是 v[i]。求解将哪些物品
装入背包可使价值总和最大。

(1) 二维数组表示

1. 定义状态:f[i][c]表示前 i 件物品恰放入一个容量为 c 的背包可以获得的最大价值。
2. 状态转移方程:

// 注意边界处理
for (int i=1;i<=n;i++)
for (int c=0;c<=C;c++)
{
f[i][c]=f[i-1][c];
if (c>=w[i]) f[i][c] = max(f[i][c], f[i-1][c-w[i]] + v[i]);
}

 时间复杂度、空间复杂度:都是 O(NC)

(2) 一维数组表示

1. 定义状态:由于递推的过程和雪天环形路上的扫雪车类似,所以可以把 i 省略。
2. 状态转移方程:

 递推时注意 c 要从 C 开始,倒着推。

// 注意边界处理
for (int i=1;i<=n;i++)
for (int c=C;c>=0;c--)
if (c>=w[i]) f[c] = max(f[c], f[c-w[i]] + v[i]);

时间复杂度:O(NC)
空间复杂度:降到了 O(C)

(3) 一维之下的一个常数优化

其实没有必要让循环下限为 0。

int bound, sumw=0;
for (int i=1;i<=n;i++)
{
sumw+=w[i];
bound = max(C – sumw, w[i]);
for (int c=C;c>=bound;c--)
if (c>=w[i]) f[c] = max(f[c], f[c-w[i]] + v[i]);
}

(4) 初始化时的细节

如果要求“恰好装满”,那么初始化时应该让 f[0]=0,其他的 f[i]=-INF。这样就可以知道是否有解了。
如果不用“恰好”,那么应该让 f 的所有元素都置 0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值