问题描述:
一个背包里可以放入重量为 weight 的物品,现有 n 件物品的集合 S,其中物品的重量分别为:w0,w1...。问题是能否从中选出若干件物品,其重量之和正好等于 weight 。如果存在就说这一背包问题有解,否则就是无解。
求解:
假设 , 。用记法 knap(weight,n)表示 n 件物品相对于总重量 weight 的背包问题,在考虑它是否有解时,通过考虑一件物品的选或者不选,可以把原问题划分为两种情况:
- 如果不选最后一件物品(其重量是),那么knap(weight,n-1)的解也就是knap(weight,n)的解,如果找到了前者的解也就找到了后者的解。
- 如果选择最后一件物品,那么如果 有解,其解加上最后一件物品就是knap(weight,n)的解,即前者有解后者也有解。
def knap(weight,wlist,n): #weight为包的容量,wlist是一个所有重量的表,n为重量数量
if weight==0:
return True;
if weight<0 or (n<1 and weight>0):
return False;
if knap(weight-wlist[n-1],wlist,n-1): #情况 2
print(wlist[n-1])
return True
if knap(weight,wlist,n-1): #情况 1
return True
else:
return False