背包问题

+#背包问题

问题:

给定 n 种物品和一个背包, 物品i的重量是 wi , 其价值为 vi , 背包的容量为 C 。背包问题是如何选择装入背包的物品, 使得装入背包中物品的总价值最大? 如果在选择装入背包的物品时, 对每种物品i只有两种选择: 装入背包或不装入背包, 即不能将物品 i 装入背包多次, 也不能只装入物品 i 的一部分, 则称为0/1背包问题。

形式化:

约束条件:

i=1nwixiCxi{0,1} (1in)

求一个向量:
X=(x1,x2,x3...,xn)

使它满足:
maxi=1nvixi

求解:

朴素方法:

遍历 X=(x1,x2,x3...,xn) 所有可能 时间复杂度 O(2n)

动态规划:

  • 最优子结构:
    X=(x1,x2x3...,xn1) 是子问题:

    i=1n1wixiCwnxnxi{0,1} (1in1)
    的最优解

    证明(反证法):
    假设: X=(x1,x2x3...,xn1) 不是子问题的最优解
    Y=(y1,y2y3...,yn1) 是子问题的最优解
    则:

    i=1n1viyii=1n1vixi

    进而得到:
    i=1n1viyi+vnxni=1n1vixi+vnxn

    得出 X=(x1,x2,x3...,xn) 不是原问题的最优解, X=(y1,y2,y3...,xn) 才是。
    与题设矛盾。

  • 构造最优解:
    如何通过子问题构造最优解?
    假如我们有问题:

    i=1nwixiCxi{0,1} (1in)

    的最优解 X=(x1,x2,x3...,xn)

    它的子问题是:
    1.如果 xn=0 :

    i=1n1wixiCxi{0,1} (1in1)

    2.如果 xn=1 :
    i=1n1wixiCwnxi{0,1} (1in1)

    状态转移方程求解:
    dp[n,C] 是问题最优解
    则:
    dp[n,C]={dp[n1,C]  (xn=0)dp[n1,Cwn]+vn  (xn=1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值