【说人话的算法小课堂】DP 求解 01 背包问题(在总重恰好为背包容量 W 的条件下)

在这里插入图片描述

01背包问题
设有n个物品,其重量(或占用空间)分别为w_1,w_2,…,w_n,价值分别为v_1,v_2,…,v_n。
给定一个总容量为W的背包,每个物品只能整个放入背包或不放。
问:如何选择放入背包的物品,使得背包中的物品的总重恰好为W的同时,总价值最大?
解法
动态规划(DP)。
将决策过程分成n个阶段,每个阶段考察1个物品是否选择。
决定是否选择某物品,要根据在其它条件不变、背包容量更小时是否选择来决定。
依次考察物品1到n。当考察物品i时,意味着前i个物品是否选择已经决定完毕。
如不选物品1,则问题化为子问题:仅可选剩余物品2, 3,…, n,容量仍为W的01背包问题。
如选择物品1,则问题化为子问题:仅可选剩余物品2, 3,…, n,容量为W-w_1的01背包问题。
对其它物品,也有类似的转化(注意背包容量W要替换为相应的剩余容量)。
根据这种子结构和递推关系可以发现:考察是否选择某物品i时,要依次考察背包容量(整数)从0到当前剩余容量的过程中是否选择该物品。再按照这个思路把n个物品都考虑一遍,结果就出来了。
于是构建二维DP数组d_(i, r),表示背包剩余容量为r,且已考虑物品1到i后,背包装入的物品的最优价值。很快就能列出状态转移方程:
█(d_(i, 0)=0#(1) )
█(d_(0, r)=0#(2) )
█(d_(i, r)=d_(i-1, r),r<w_i#(3) )
█(d_(i, r)=max⁡(d_(i-1, r), d_(i-1, r-w_i )+v_i ),r≥w_i#(4) )
显然方程(1)(2)为边界条件,递推从这两个条件开始。
方程(3)针对的是背包的剩余容量已经无法放入物品i的情况。这时只能不选择物品i,背包已有物品的总价值不变。
方程(4)针对的是背包的剩余容量可以满足放入物品i的情况。这时候既可以选择物品i也可以不选择物品i,在已知其它条件不变、背包容量更小时的最优解的情况下,正在考虑的子问题(背包容量为当前容量r)的最优解就由是否选择这个物品i来决定,因此要看放或不放这两个选择中,哪个能带来更大的总价值。
可通过二重循环构造该DP矩阵。循环结束后,d_(n, w)存放了最优解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值