状态表示集(合dp[i][j]的含义):在背包承重为 [ j ]的前提下,从前 [ i ]个物品中选能够得到的最大价值
集合属性:求max
状态计算:将集合划分为有第i个背包和没有第i个背包的两种情况
代码:
python复制代码
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)