01背包问题初探

题目:
背包容量为12,有物品1,2可供选择

物品 占用空间 价值 数量
物品1 2 3 5
物品2 3 4 2

求在背包中装入价值最大的解决方案。

2019/2/27
补充:背包问题分为9类,上面的问题严格来说属于完全背包问题,有特殊解法,参考https://www.cnblogs.com/jbelial/articles/2116074.html。
使用完全背包问题的解法后面附上。


思路:

  • 5个物品1可等价为5个物品,2个物品2可以等价为2个物品,这样一共有7个物品,转换为7个物品的0-1背包问题。
  • 对于第i个物品,背包问题的基本递推公式如下:
    1. Wi>W,装不下了,则M(i, W)=M(i-1, W);
    2. Wi<=W,那么选择装或者不装,则M(i, W)=max{M(i-1, W) , M(i-1, W-Wi)+Vi}。
  • 装第i个物品的价值由第i-1个物品有关,因此可以想到递归;同时,也可以选择将前i-1个物品的状态保存,使用动态规划。

结果:
max_val:17
num1:3, num2:2

由于本题目只有两类物品,枚举当然也是合适的,但是如果物品种类数t>=3,那么时间复杂度肯定是无法接受的。

枚举
def func1(x1,x2,space):
	max_val,num1,num2=0,[],[]
	for i in range(x1[2]+1):
		for j in range(x2[2]+1):
			if i*x1[0]+j*x2[0]<=space:
				if i*x1[1]+j*x2[1]>max_val:
					num1,num2=[i],[j]
					max_val=i*x1[1]+j*x2[1]
				elif i*x1[1]+j*x2[1]==max_val:
					num1.append(i)
					num2.append(j)
					max_val=i*x1[1]+j*x2[1]
	print('max_val:%d'%max_val)
	for i in range(len(num1)):
		print('num1:%d, num2:%d'%(num1[i],num2[i]))
x1=[2,3,5]
x2=[3,4,2]
space=12
func1(x1,x2,space)

注:物品种类数为n,数量分别为t1,t2,…,tn,使用枚举需要的时间复杂度O ( ∏ i = 1 n t i \prod_{i=1}^{n} t_i i=1n

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值