N,V=map(int,input().split())
v=[0]#体积
w=[0]#价值
#输入体积和价值
for i in range(N):
a,b=map(int,input().split())
v.append(a)
w.append(b)
f=[[0 for i in range(V+1)]for i in range(N+1)]
for i in range(1,N+1):
for j in range(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])
#完全背包
#f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i])
print(f[N][V])
2. 完全背包问题
python复制代码
#f[i][j]:所以前i个背包,体积为j的价值
N,V=map(int,input().split())
v=[0]
w=[0]
for i in range(N):
a,b=map(int,input().split())
v.append(a)
w.append(b)
f=[[0 for i in range(1010)]for j in range(N+1)]
for i in range(1,N+1):
for j in range(0,V+1):
f[i][j]=f[i-1][j]
if j-v[i]>=0:
f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]) #与01背包只有此处不同
print(f[N][V])
3. 线性DP
python复制代码
#状态表示:dp[i] 长度 dp[i] i:所有到w[i]时的方案数
#max
#最后:if w[j]>w[i]: f[i]+=1
n=int(input())
w=list(map(int,input().split()))
f=[[0 for i in range(n+1)]for i in range(n+1)]
result=0
for i in range(1,n+1):
f[i]=1 #空集,只有a[i]一个
for j in range(1,i):
if w[j-1]<w[i-1]:
f[i]=max(f[i],f[j]+1)
result=max(result,f[i])
print(result)