【问题描述】0-1背包问题

小例子

给你一个背包,在你面前有许多物品,包括:一个最新款的苹果手机、一个相机、一个笔记本电脑、一个锅、一根金条、一台电视、一个空调……,你可以拿任意的东西,但必须都装到背包里,你会怎么拿才能使拿到的东西最值钱?

抽象例子

有N种物品,设第1个物品的重量是W1,价值是V1;第2个物品的重量是W2,价值是V2;……第n个物品的重量是Wn,价值是Vn。背包的容量为C。

我们的目标:

  • 所挑选的物品的重量和不能超过C
  • 所挑选的物品价值和最大

数学描述

给定n种物品和一个背包。物品i的重量是Wi,价值是Vi,背包容量为C
C > 0 , w i > 0 , v i > 0 , 1 ⩽ i ⩽ n C>0,w_i>0,v_i>0,1\leqslant i\leqslant n C>0wi>0vi>01in
求 ( x 1 , x 2 , . . . , x n ) , x i = 0 或 1 求(x_1,x_2,...,x_n),x_i=0或1 (x1,x2,...,xn)xi=01

  • ∑ i = 1 n w i x i ⩽ C \sum_{i=1}^n w_i x_i \leqslant C i=1nwixiC
  • m a x ∑ i = 1 n v i x i max\sum_{i=1}^n v_i x_i maxi=1nvixi

性质

最优子结构性质

设 ( a 1 , a 2 , … … , a n ) 是 最 优 解 , 则 把 第 一 个 物 品 去 掉 的 子 问 题 的 最 优 解 是 ( a 2 , … … , a n ) 设(a_1,a_2,……,a_n)是最优解,则把第一个物品去掉的子问题的最优解是(a_2,……,a_n) (a1,a2,,an)(a2,,an)

这里解释一下什么是“把第一个物品去掉的子问题”:
有N-1种物品,设第1个物品的重量是W2,价值是V2;第2个物品的重量是W3,价值是V3;……第n-1个物品的重量是Wn,价值是Vn
如果原问题的最优解中,拿了第一个物品(a1=1),则该子问题的背包容量为C-W1;没拿(a1=0),该子问题的背包容量为C。总之,该子问题的背包容量为C-W1*a1

使用反证法证明
假 设 把 a 1 去 掉 的 子 问 题 的 最 优 解 不 是 ( a 2 , … … , a n ) , 而 是 ( b 2 , … … , b n ) 假设把a_1去掉的子问题的最优解不是(a_2,……,a_n),而是(b_2,……,b_n) a1(a2,,an)(b2,,bn)
此 时 : ∑ i = 2 n v i b i > ∑ i = 2 n v i a i ⇒ v 1 a 1 + ∑ i = 2 n v i b i > ∑ i = 1 n v i a i 此时:\sum_{i=2}^n v_i b_i > \sum_{i=2}^n v_i a_i \Rightarrow v_1 a_1 + \sum_{i=2}^n v_i b_i > \sum_{i=1}^n v_i a_i i=2nvibi>i=2nviaiv1a1+i=2nvibi>i=1nviai
而 且 : ∑ i = 2 n w i b i ⩽ C − w 1 a 1 ⇒ w 1 a 1 + ∑ i = 2 n w i b i ⩽ C 而且:\sum_{i=2}^n w_i b_i \leqslant C-w_1 a_1 \Rightarrow w_1 a_1 + \sum_{i=2}^n w_i b_i \leqslant C i=2nwibiCw1a1w1a1+i=2nwibiC
所 以 : ∑ i = 1 n v i a i 已 不 是 最 大 值 , 即 ( a 1 , a 2 , … … , a n ) 不 是 最 优 解 。 最 优 解 变 成 了 ( a 1 , b 2 , … … , b n ) 所以:\sum_{i=1}^n v_i a_i已不是最大值,即(a_1,a_2,……,a_n)不是最优解。最优解变成了(a_1,b_2,……,b_n) i=1nviai(a1,a2,,an)(a1,b2,,bn)
与 前 提 矛 盾 , 故 子 问 题 的 最 优 解 是 ( a 2 , … … , a n ) 与前提矛盾,故子问题的最优解是(a_2,……,a_n) (a2,,an)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值