问题描述
所谓二维背包,无非就是在原来的01背包基础上加了一个限制条件,这里假如是承重。
先回顾一下01背包的问题描述:给定一个容积为V的背包,现在有n件物品,第i件物品的体积为w i,价值为vi,每件物品只能拿或者不拿,请求出体积总和不超过V的最大价值。
现在加一个承重的条件就变成了给定一个体积为V,承重为M的背包,现有N件物品,第i件物品的体积为vi,重量为mi,价值为wi 每件物品拿或不拿,求体积总和不超过V且承重不超过M最大价值。
状态
参考原来01背包的状态dp[i][j]表示前i件物品,体积为j
二维背包就是加了一个重量的维度。
dp[i][j][k]表示前i件物品,体积为j,重量为k的最大价值。
状态转移方程
dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-v[i]][k-m[i]]+v[i])
滚动数组优化
状态转移方程为:dp[j][k]=max(dp[j][k],dp[j-v][k-m]+w)
例题
题目描述
如上
输入描述
第一行:三个整数N,V,M。
接下来的N行,每行三个整数v,m,w,用空格隔开。
输出描述
输出一个整数表示最大价值
代码
N,V,M=map(int,input().split())
dp=[[0]*(M+1) for _ in range(V+1)]
for i in range(N):
v,m,w=map(int,input().split())
for j in range(V,v-1,-1):
for k in range(M,m-1,-1):
dp[j][k]=max(dp[j][k],dp[j-v][k-m]+w)
print(dp[V][M])