[toc]
说明:
本文所讲内容摘录自崔添翼:背包九讲,并对其中的数学内容和一些较为复杂的内容进行了删减,增加了基础的例题,只是面向初学者或者不需要深入理解背包及其衍生问题的读者,如果有能力并且有意愿加深理解,本文可能会对您形成误导,请移步崔添翼:背包九讲.
二维费用的背包问题
题目
二维费用的背包问题是指:对于每件物品,只能使用一次,但是其具有两种不同的费用,选择这件物品必须同时付出这两种费用。对于每种费用都有一个可付出的最大值(背包容量)。问怎样 选择物品可以得到最大的价值。 设第 i
件物品所需的两种费用分别为 $C_i$ 和 $D_i$。两种费用可付出的最大值(也即两种背包容量)分别为 V
和 U
。物品的价值为 $W_i$。
基本思路
费用加了一维,只需状态也加一维即可。设 $F[i, v, u]$ 表示前 i
件物品付出两种费用分别为 $v$ 和 $u$ 时可获得的最大价值。
$$
F[i, v, u] = max\left{F[i − 1, v, u], F[i − 1, v −C_i, u −D_i] +W_i\right}
$$
上述问题的伪代码
1 | int N, V, M; |
注意❗: 外层i
枚举物品的数量,内层j
枚举背包可以容纳的容量,最内层k
枚举背包可以承载的重量
注意❗❗❗: 转移方程为dp[i][j][k] = Math.max(dp[i-1][j][k], dp[i - 1][j - cv[i][0]][k-cv[i][1]] + cv[i][2])
max函数里面是dp[i][j]
和dp[i - 1][j - k * cv[i][0]] + k * cv[i][1]
这两项, 切记!切记!
一个简单有效的优化
略🚮🤐(太菜了,慢慢来)
相关题目练习
题目URL
有 N
件物品和一个容量是 V
的背包,背包能承受的最大重量是 M
。
每件物品只能用一次。 体积是 $v_i$,重量是 $m_i$,价值是 $w_i$。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。
输入格式
第一行两个整数,N
,V
,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。
接下来有 N
行,每行三个整数 $v_i,m_i,w_i$,用空格隔开,分别表示第 i
件物品的体积、重量和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
$0<N≤10000<N≤1000$
$0<V,M≤1000<V,M≤100$
$0<vi,m_i≤1000<v_i,m_i≤100$
$0<w_i≤10000<w_i≤1000$
输入样例
1 | 4 5 6 |
输出样例:
1 | 8 |
题目解法
1 | import java.util.*; |
参考文献