题目:
背包容量为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个物品,背包问题的基本递推公式如下:
- Wi>W,装不下了,则M(i, W)=M(i-1, W);
- 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