0/1背包
蓝桥杯题目 1174 小明的背包
特点
1.每个物品不可分割,且不可被重复装入
2.只有装和不装两种情况
小明的背包是一种经典的背包问题,考虑一个物品是否被装入,主要需要考虑两个问题:
第一:背包是否有最大容量装入该物品
第二:当背包的当前的最大容量可以装入该物品时,往往可能会影响到其他物品,那究竟是取出之前装入的物品更好一些,还是不去装它更好一些?
注意是最大容量,空余容量可以装入的话,一定是多多益善的
DP状态
我们采用dp[N][C]作为我们的状态方程,其中N代表物品是否要装入,C代表背包容量
DP转移方程
即判断是否该背包是否被装入:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+x[i])
代码
注意一层循环是物品,这样保证了每个物品只被装入1次
n,v=map(int,input().split())
w = [0]*(n+1)
x = [0]*(n+1)
dp = [ [0]*(v+1) for i in range(n+1) ]
for i in range(1,n+1):
w[i],x[i]=map(int,input().split())
for i in range(1,n+1):
for j in range(1,v+1):
if w[i]<=j:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+x[i])
else:
dp[i][j]=dp[i-1][j]
print(dp[n][v])