Python动态规划实现01背包问题详解
本文通过Python实例演示如何利用动态规划算法解决01背包问题。文章详细阐述了状态转移逻辑,提供了自底向上的完整代码实现,包括价值计算与物品选择回溯,并展示了针对特定参数n=5、c=10的运行结果,帮助开发者理解重叠子问题的优化思路。
本文通过Python实例,详细讲解如何利用动态规划算法解决经典的01背包问题,内容供读者参考学习。
在01背包问题中,决策核心在于权衡是否将某物品放入背包。这需要比较“包含该物品”与“不包含该物品”两种情况下的子问题解,这种决策机制往往产生大量重叠子问题,因此采用动态规划是高效的解决策略。设定物品数量n=5,背包最大承重c=10,各物品重量数组w=[2,2,6,5,4],价值数组v=[6,3,5,4,6]。首先确立递归定义的基础逻辑:

随后采用自底向上的方式构建解空间,具体实现代码如下:
def bag(n,c,w,v):
res=[[-1 for j in range(c+1)] for i in range(n+1)]
for j in range(c+1):
res[0][j]=0
for i in range(1,n+1):
for j in range(1,c+1):
res[i][j]=res[i-1][j]
if j>=w[i-1] and res[i][j]<res[i-1][j-w[i-1]]+v[i-1]:
res[i][j]=res[i-1][j-w[i-1]]+v[i-1]
return res
def show(n,c,w,res):
print('最大价值为:',res[n][c])
x=[False for i in range(n)]
j=c
for i in range(1,n+1):
if res[i][j]>res[i-1][j]:
x[i-1]=True
j-=w[i-1]
print('选择的物品为:')
for i in range(n):
if x[i]:
print('第',i,'个,',end='')
print('')
if __name__=='__main__':
n=5
c=10
w=[2,2,6,5,4]
v=[6,3,5,4,6]
res=bag(n,c,w,v)
show(n,c,w,res)
程序运行输出结果如下所示:

如需深入了解Python相关技术,可参考本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》以及《Python入门与进阶经典教程》。
期望本文提供的解决方案能对各位的Python编程实践有所助益。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













