动态规划就是将问题划分为子问题,通过子问题的最优解得到原问题的最优解。动态规划把每个求解过程的子问题记录下来,下次碰到同样的子问题可以直接使用之前的结果。下面学习一类经典的背包问题。
1.01背包问题
问题是这样的:n 件物品,每个重量 w[i],价值 c[i] 。背包容量 V。问如何使得背包内物品总价值最大。每种物品只有一件。
定义 dp[i][j] 表示前 i 件物品装入容量 j 的背包的价值,那么:
dp[i][j] = Math.max(
dp[i-1][j], // 不放第 i 件物品
dp[i-1][j-w[i]] + c[i] // 放第 i 件物品
)
因此代码如下:
for (int i = 0; i < n; i++) {
for (int j = w[i]; j <= V; j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]);
}
}
空间优化:
for (int i = 0; i < n; i++) {
for (int j = V; j >= w[i]; j--) {
dp[j] = Math