python递归解决0-1背包问题
#coding:utf-8 #递归实现的背包算法 #背包大小 bag=10 #物品大小清单 list=[5,9,8,2,4,1,6,7,3] #预处理:从小到大排序 list.sort() #求背包组合 def getb(B,L): #本次查找结果 r=[] #取最小数 for k in range(0,len(L)): #去掉前面的k-1个元素,组成sL列表,在此基础上查找,以免出现重复的组合 sL=L[k:] if len(sL)<2: break #取第一个元素(列表中的最小元素) x=sL[0] #背包的剩余空间 e=B-x #查找e是否在表中,从sL[1]开始查找 for i in range(1,len(sL)): #找到等于e的值,存入这组结果 if sL[i]==e: r.append([x,sL[i]]) break elif sL[i]>e: break #取子列表,sL[i]>=e的情况取中间的片段(减少不必要的开销),否则取从1开始的全部片段 if sL[i]>=e: sL=sL[1:i] else: sL=sL[1:] #继续在子列表sL[1:]中以e为背包大小求组合 sr=getb(e,sL) #查找的子结果处理后添加到结果列表中 for j in sr: j.insert(0,x) r.extend(sr) #返回本次查找结果 return r #计算结果,输出结果 result=getb(bag,list) for i in result: print i
输出结果:[1, 9][1, 2, 7][1, 2, 3, 4][1, 3, 6][1, 4, 5][2, 8][2, 3, 5][3, 7][4, 6]