N, V = map(int,input().split())
v = []
w = []
ans = [0]*(V+1)
for i in range(N):
a,b = map(int,input().split())
v.append(a)
w.append(b)
for i in range(N):
for j in range(V,-1,-1):
if j >= v[i]:
ans[j] = max(ans[j],ans[j-v[i]]+w[i])print(ans)print(ans[V])
0-1背包求方案数
mod = 10**9+7
N, V = map(int,input().split())
cnt = [1] * (V+1)
f = [0] * (V+1)
for i in range(N):
v, w = map(int,input().split())
for j in range(V, v-1, -1):
val = f[j-v] + w
if val > f[j]:
#选择这个数
f[j] = val
cnt[j] = cnt[j-v]
elif val == f[j]:
#不选择当前数
cnt[j] = (cnt[j] + cnt[j-v]) % mod
print(int(cnt[V]))
0-1背包具体方案
N, V = map(int,input().split())
v, w = [], []
f = [[0] * (V + 1) for _ in range(N + 1)]
#f[i][j]表示考虑后i个物体且当前体积不超过j
path = []
for i in range(N):
a, b = map(int,input().split())
v.append(a)
w.append(b)
for i in range(N - 1, -1, -1):
for j in range(1, V + 1):
f[i][j] = f[i + 1][j]
if j >= v[i]:
f[i][j] = max(f[i][j], f[i + 1][j - v[i]] + w[i])
j = V
print(f)
for i in range(N):
if j >= v[i] and f[i][j] == f[i + 1][j - v[i]] + w[i]:
#放入v[i]
path.append(i + 1)
j -= v[i]
print(path)
for i in range(len(path)):print(path[i],end=" ")
完全背包
N,V = map(int,input().split())
ans = [0]*(V+1)
for i in range(N):
v,w = map(int,input().split())
for j in range(v,V+1):
ans[j] = max(ans[j],ans[j-v]+w)print(ans[V])
多重背包
N,V = map(int,input().split())
ans = [0]*(V+1)
v = []
w = []
total= 0
for i in range(N):
a,b,s = map(int,input().split())
#将多重背包转化为0-1背包
for i in range(s):
v.append(a)
w.append(b)
total += s
for i in range(total):
for j in range(V,-1,-1):
if j >= v[i]:
ans[j] = max(ans[j],ans[j-v[i]] + w[i])print(ans[V])
多重背包的二进制优化
N,V = map(int,input().split())
v = []
w = []
ans = [0]*(V+1)
for i in range(N):
a,b,s = map(int,input().split())
k = 1
while k <= s:
v.append(a*k)
w.append(b*k)
s -= k
k *= 2
#二进制增长
if s > 0:
v.append(a*s)
w.append(b*s)
for i in range(len(v)):
for j in range(V,-1,-1):
if j >= v[i]:
ans[j] = max(ans[j],ans[j-v[i]]+w[i])print(ans[V])
分组背包
N,V = map(int,input().split())
ans = [0]*(V+1)
for i in range(N):
#枚举第i组
s = int(input())
v,w = [],[]
for j in range(s):
a,b = map(int,input().split())
v.append(a)
w.append(b)
for j in range(V,-1,-1):
for k in range(s):
if j >= v[k]:
ans[j] = max(ans[j],ans[j-v[k]]+w[k])print(ans[V])