问题描述:
一个背包里可以放入重量为weight的物品,现有n件物品的集合是S,其中物品的重量分别为w(0),w(1).......w(n-1)。问题是能否从中选出若干个物品,重量之和=weight,如果存在,这一个背包问题有解,不存在则无解
考虑一:不选最后一个物品:如果f(weight,n-1)有解,则f(weight,n)有解
考虑二:选最后一个物品:如果f(weight-w(n-1),n-1)有解,则f(weight,n)有解
代码:
def knap_rec(weight,wlist,n) :
#如果weight=0,说明有解
if weight == 0 :
return True
#weight<0,或者东西全部放入,weight>0,无解
if weight < 0 or (weight >0 and n < 1) :
return False
#第一种递归:放入最后一个物品
if knap_rec(weight - wlist[n-1],wlist,n-1) :
print("Item" + str(n) + ":" , wlist[n-1])
return True
#第二种:不放最后一个物品
if knap_rec(weight,wlist,n-1) :
return True
else :
return False