题目:背包容量bagv,物品thing_v

问题:1.是否可以装满背包2.装满背包最少需要多少件物品3.装满背包最多需要多少件物品4.该背包最多一共可以装多重的物品5.装满背包一共有多少种方案[就算物品重量一样,但也是不同的方案]

一、01背包

def Bag_01(bag_v,thing_v):
#是否可以装满的背包问题,装满这个背包最少需要多少件物品 最多需要多少件物品 尽可能把背包装满的最大重量 装满有多少种方案 五大问题
#这里的物品只有取和不取,bag_v背包的体积 thing_v物品各自的体积
FullBagBool = [False] * (bag_v + 1);FullBagBool[0] = True#当使用第0件物品时,可以填满容积为0的包,儿其他容积则无法填满。
MinNum = [float('inf')] * (bag_v + 1);MinNum[0] = 0#当使用第0件物品时,可以填满容积为0的包,至少为 0件儿其他容积则无法填满。
Maxnum = [-float('inf')] * (bag_v + 1);Maxnum[0] = 0#当使用第0件物品时,可以填满容积为0的包,至多为0件,其它无法填满
MaxWeight = [0] * (bag_v + 1)#使用第0件物品时,最大装的只是0
PlanNum = [0] * (bag_v + 1);PlanNum[0] = 1#使用第0件物品装满其它容积这是不存在的事情,所以是0个方案
for i in range(1,len(thing_v) + 1):
for j in range(bag_v,thing_v[i - 1] - 1,-1):
FullBagBool[j] |= FullBagBool[j - thing_v[i - 1]]
if thing_v[i - 1] <= j:
MinNum[j] = min(MinNum[j],MinNum[j - thing_v[i - 1]] + 1)
Maxnum[j] = max(Maxnum[j],Maxnum[j - thing_v[i - 1]] + 1)
MaxWeight[j] = max(MaxWeight[j],MaxWeight[j - thing_v[i - 1]] + thing_v[i - 1])
PlanNum[j] += PlanNum[j - thing_v[i - 1]]
return FullBagBool,MinNum,Maxnum,MaxWeight,PlanNum

二、完全背包

def Bag_wanquan(bag_v,thing_v):
# 是否可以装满的背包问题,装满这个背包最少需要多少件物品 最多需要多少件物品 尽可能把背包装满的最大重量 装满有多少种方案 五大问题
# 这里的物品可以取无限件,bag_v背包的体积 thing_v物品各自的体积
FullBagBool = [False] * (bag_v + 1);FullBagBool[0] = True
MinNum = [float('inf')] * (bag_v + 1);MinNum[0] = 0
MaxNum = [-float('inf')] * (bag_v + 1);MaxNum[0] = 0
MAxWeight = [0] * (bag_v + 1)
PlanNum = [0] * (bag_v + 1);PlanNum[0] = 1
for i in range(1,len(thing_v) + 1):
for j in range(thing_v[i - 1],bag_v + 1):
FullBagBool[j] |= FullBagBool[j - thing_v[i - 1]]
if thing_v[i - 1] <= j:
MinNum[j] = min(MinNum[j],MinNum[j - thing_v[i - 1]] + 1)
MaxNum[j] = max(MaxNum[j],MaxNum[j - thing_v[i - 1]] + 1)
MAxWeight[j] = max(MAxWeight[j],MAxWeight[j - thing_v[i - 1]] + thing_v[i - 1])
PlanNum[j] += PlanNum[j - thing_v[i - 1]]
return FullBagBool,MinNum,MaxNum,MAxWeight,PlanNum

三、结果

if __name__ == '__main__':
bag_v = 6;
thing_v = [2,2,4]
a,b,c,d,e = Bag_01(bag_v,thing_v)
print('简单01背包,每个物品只有一件'.center(100,'*'))
print('是否可以装满背包:', a)
print('装满背包最少需要物品的数量:', b)
print('装满背包最多需要物品的数量:', c)
print('背包最多可以装多重:', d)
print('装满背包的方案数:', e)
print('简单01背包,每个物品只有一件'.center(100, '*'))
a,b,c,d,e = Bag_wanquan(bag_v,thing_v)
print('简单01背包,每个物品不限量'.center(100,'*'))
print('是否可以装满背包:', a)
print('装满背包最少需要物品的数量:', b)
print('装满背包最多需要物品的数量:', c)
print('背包最多可以装多重:', d)
print('装满背包的方案数:', e)
print('简单01背包,每个物品不限量'.center(100, '*'))
OutPut:

******************************************简单01背包,每个物品只有一件*******************************************

是否可以装满背包: [True, False, True, False, True, False, True]

装满背包最少需要物品的数量: [0, inf, 1, inf, 1, inf, 2]

装满背包最多需要物品的数量: [0, -inf, 1, -inf, 2, -inf, 2]

背包最多可以装多重: [0, 0, 2, 2, 4, 4, 6]

装满背包的方案数: [1, 0, 2, 0, 2, 0, 2]

******************************************简单01背包,每个物品只有一件*******************************************

*******************************************简单01背包,每个物品不限量*******************************************

是否可以装满背包: [True, False, True, False, True, False, True]

装满背包最少需要物品的数量: [0, inf, 1, inf, 1, inf, 2]

装满背包最多需要物品的数量: [0, -inf, 1, -inf, 2, -inf, 3]

背包最多可以装多重: [0, 0, 2, 2, 4, 4, 6]

装满背包的方案数: [1, 0, 2, 0, 4, 0, 6]

*******************************************简单01背包,每个物品不限量*******************************************