01背包 完全背包 多重背包 分组背包Python模板

背包模板Python

根据Acwing里y总的代码,写了个Python的版本几个典型的背包问题的模板
01背包
完全背包
多重背包
分组背包


提示:以下是本篇文章正文内容,下面案例可供参考

一、01背包

##01背包##
n, m = map(int ,input().split())
v = [0] * (n + 1)
w = [0] * (n + 1)
f = [0] * (m + 1)
for i in range(1, n + 1):
    v_, w_ = map(int, input().split())
    v[i] = v_
    w[i] = w_
for i in range(1, n + 1):
    for j in range(m, v[i] - 1, -1):
        f[j] = max(f[j],f[j - v[i]] + w[i])
print(f[m])

二、完全背包

##完全背包##
n, m = map(int, input().split())

v = [0] * (n + 1)
w = [0] * (n + 1)

for i in range(1, n + 1):
    v[i], w[i] = map(int, input().split())

f = [0] * (m + 1)
for i in range(1, n + 1):
    for j in range(v[i], m + 1):
        f[j] = max(f[j], f[j - v[i]] + w[i])
print(f[m])

三、多重背包

##多重背包##
'''
朴素做法
n, m = map(int, input().split())

v = [0] * (n + 1)
w = [0] * (n + 1)
s = [0] * (n + 1)

for i in range(1, n + 1):
    v[i], w[i], s[i] = map(int, input().split())
f = [[0] * (m+1) for i in range(n+1)]
for i in range(1, n + 1):
    for j in range(0, m + 1):
        for k in range(0, s[i] + 1):
            if k * v[i] <= j:
                f[i][j] = max(f[i][j],f[i - 1][j - k * v[i]] + k*w[i])
print(f[n][m])
'''
#二进制优化
n, m = map(int , input().split())
v = [0] * 12010
w = [0] * 12010
f = [0] * (m + 1)
cnt = 0
for i in range(1, n + 1):
    a, b, s = map(int, input().split())
    k = 1
    while(k <= s):
        cnt += 1
        v[cnt] = a * k
        w[cnt] = b * k
        s -= k
        k *= 2
    if(s > 0):
        cnt += 1
        v[cnt] = s * a
        w[cnt] = s * b

for i in range(1, cnt + 1):
    for j in range(m, v[i]- 1, -1):
        f[j] = max(f[j], f[j - v[i]] + w[i]);
print(f[m])

四、分组背包

n, m = map(int , input().split())
N = 110
s = [0] * N
v = [0] * N
w = [0] * N
f = [0] * N
for i in range(1, n + 1):
    s = int(input())
    for j in range(1, s + 1):
        v[j], w[j] = map(int, input().split())
    for j in range(m, 0, -1):
        for k in range(1, s + 1):
            if (j >= v[k]):
                f[j] = max(f[j], f[j - v[k]] + w[k])
print(f[m])

总结

背包问题总是看一次忘一次。。。不过遇到具体问题主要还是得自己找状态表示方式和状态转移方程~加油鸭!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值