python背包问题_背包问题Python

题目:背包容量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背包,每个物品不限量*******************************************

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值