穷举法求解0/1背包问题

本文介绍了如何运用穷举法解决0/1背包问题,将问题转化为二叉树结构,通过二进制表示选择状态。在有限空间内,通过筛选选择价值最大且不超过背包容量的物品组合,最终找到最优解。以一个规模为5,背包最大容量为20的例子,展示了具体计算过程,得到最大价值为26,最优取法为取第4、3、2和0号物品。
摘要由CSDN通过智能技术生成

老师好,我是刁同学
关于如何理解这个问题,我看了很多其他博主写的博客,但是大多数关于穷举法的(在我看来比较麻烦,思路上不太清晰),从问题的本源来说,这就是一个关于选择的问题。就像是传送带上的物品,而你只有一个有限的背包,对于你来说只是要不要眼前的序号为i的物品,从你开始选择开始,如果没有背包限额的规定,直到最后一个物品t的选择截止,你一共只有2^t种不同的选择(对每个单独的物品来说只有选或者不选)。明明晃晃的二叉树结构,而这种结构,被二进制的01字符串演绎的淋漓尽致,我们甚至都不需要做其他的改动。把十进制转化成二进制,就是我们所有的选择了。0代表不选,1代表选。在面对有限空间时,我们就要考虑每次选择之后的剩余空间了,这也不是太难的问题,只需简单统计即可。在每种选择背后,如果背包在你还没选完时就已经满了,就不需考虑这种取法了。在所有选择中一定有比他更合适的。最后,只需在符合条件的情况下,选择价值最大就行了,而他就是你要的答案。

import math
N=[]#确定组合数
V=[]#记录每件物品的价值
M=[]#记录每件物品重量
C=[]#记录总价
W=[]#记录总重量
max=0#记录最大取值
NUM=0#最大取值时的取法
t=int(input("请输入问题规模:"))
b=int(input("输入背包的最大容量:"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值