01背包问题
题目来源:acwing
N=1005
#f[i][j]:i件物品,体积为j 属性:总价值max
#分割:不要第i件物品,f[i][j]=f[i-1][j]
#要第i件物品:f[i-1][j-v(i)]+w[i]
f=[[0 for i in range(N)]for i in range(N)]
a=[0 for i in range(N)]
b=[0 for i in range(N)]
n,v=map(int,input().split())
for i in range(1,n+1):
a[i],b[i]=map(int,input().split())
for i in range(1,n+1):
for j in range(1,v+1):
if j>=a[i]:
f[i][j]=max(f[i][j],f[i-1][j-a[i]]+b[i])
else:
f[i][j]=f[i-1][j]
print(f[n][v])
区分01背包和完全背包的优化: 二维 =>一维:
N=1005
#f[i][j]:i件物品,体积为j 属性:总价值max
#分割:不要第i件物品,f[i][j]=f[i-1][j]
#要第i件物品:f[i-1][j-v(i)]+w[i]
f=[0 for i in range(N)]
a=[0 for i in range(N)]
b=[0 for i in range(N)]
n,v=map(int,input().split())
for i in range(1,n+1):
a[i],b[i]=map(int,input().split())
for i in range(1,n+1):
for j in range(v,a[i]-1,-1):
f[j]=max(f[j],f[j-a[i]]+b[i])
print(f[v])