背包问题解析(三)-动态规划算法
一、题目:
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
下面讲述的例子均先用具体的数字代入,即:eg:number=3,capacity=8

二、背包问题的解决过程
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
1、建立模型,即求max(V1X1+V2X2+…+VnXn);
2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;
3、寻找递推关系式,面对当前商品有两种可能性:包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);
由此可以得出递推关系式:
j<w(i) V(i,j)=V(i-1,j)
j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
三、填表处理:
首先初始化边界条件,V(0,j)=V(i,0)=0;
V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值
v(0,j)表示当前容量为j,前0个物品最佳组合对应价值,显然应为0
v(j,0)表示当前容量为0,前j个物品最佳组合对应价值,显然亦应为0;
然后一行一行的填表:

如,i=1,j=1,w(1)=2,v(1)=3,有j<w(1),故V(1,1)=V(1-1,1)=0;
又如i=1,j=2,w(1)=2,v(1)=3,有j=w(1),故V(1,2)=max{ V(1-1,2),V(1-1,2-w(1))+v(1) }=max{0,0+3}=3;
如此下去,填到最后一个

四、python代码实现:
num=int(input("请输入可放的商品个数:"))
bag=int(input("请输入背包容量:"))
w=[]#容量表
v=[]#价值表
for i in range(num):
str1=input("请分别输入每个商品的容量,与价值,以空格隔开:")
w.append(int(str1.split(" ")[0]))
v.append(int(str1.split(" ")[1]))
print("容量为",w)
print("体积为",v)
# 动态规划
#动态构建v模型(mum+1)*(bag+1),初始化全0
module=[[0 for i in range(bag+1)] for i in range(num+1)]
print("初始化:",module)
for i in range(1,num+1):
for j in range(1,bag+1):
if w[i-1]>j:#当第i次的物品容量小于背包容量,不拿,最大容量与上一次的相等
module[i][j]=module[i-1][j]
else:#否则,物品容量小于等于当年背包容量,可以选择放或不放,不放即上一次的背包
module[i][j]=max(module[i-1][j],module[i-1][j-w[i-1]]+v[i-1])
for i in range(len(module)):
print(module[i])
print("最大价值为:",module[num][bag])
结果展示:

五、算法分析:
动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,最终达到解决原问题的效果。但不同的是,分治法在子问题和子子问题等上被重复计算了很多次,而动态规划则具有记忆性,通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。
最优性原理是动态规划的基础,最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了