背包模板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])
总结
背包问题总是看一次忘一次。。。不过遇到具体问题主要还是得自己找状态表示方式和状态转移方程~加油鸭!