书包问题,动态规划专场
P1048 [NOIP2005 普及组] 采药
简单0-1背包问题
t,m=map(int,input().split())
w=[0]
v=[0]
dp=[0 for i in range(t+1)]
for _ in range(m):
t1,m1=map(int,input().split())
w.append(t1)
v.append(m1)
for i in range(1,m+1):
for j in range(t,0,-1):
if w[i]<=j:
dp[j]=max(dp[j],dp[j-w[i]]+v[i])
print(dp[t])
P1049 [NOIP2001 普及组] 装箱问题
0-1背包问题,权重(价值)即为重量
w=[0]
c=int(input())
n=int(input())
dp=[0 for _ in range(c+1)]
for _ in range(n):
w.append(int(input()))
for i in range(1,n+1):
for j in range(c,0,-1):
if w[i]<=j:
dp[j]=max(dp[j],dp[j-w[i]]+w[i])
print(c-dp[c])
P1060 [NOIP2006 普及组] 开心的金明
注意这题的价值是价格(重量)*权重等级(价值)
w=[0]
v=[0]
n,m=map(int,input().split())
dp=[0 for _ in range(n+1)]
for _ in range(m):
a,b=map(int,input().split())
w.append(a)
v.append(b)
for i in range(1,m+1):
for j in range(n,0,-1):
if w[i]<=j:
dp[j]=max(dp[j],dp[j-w[i]]+w[i]*v[i])
print(dp[n])