//从上个月末之后就开始有点浮躁起来,本来计划国庆查漏补缺的,结果网卡光荣的坏了ORZ……无论如何,OFFER现在还没有拿到,即便是拿到了也不该放松学习的状态。Stay Hungry,Stay Foolish
背包问题是动态规划的经典问题,LeetCode上有五种背包的变种问题,现在总结一下。
背包问题一(最大放入重量)
题目描述:
Given n items with size Ai, an integer m denotes the size of a backpack.
How full you can fill this backpack?
样例输入:
[2,3,5,7],11
[2,3,5,7],12
样例输出:
10
12
最普通的一种背包问题,求在指定容量为m的背包中可以放入的最大容量
首先介绍一种使用二维辅助数组dp[i][j]
的方法
二维数组dp[i][j](0<=i<A.length,0<=j<=m)
表示在最大容量为j,可放入容量是A[0..i]的情况下可放入的最大容量,可以分为两种情况
- 当前背包最大容量小于物品的重量,可容纳的最大重量是
dp[i-1][j]
- 当前背包最大容量小于物品重量,可容纳的最大重量是
max(dp[i-1][j],dp[i-1][j-A[i]+A[i])
代码如下
public int backPack(int[] A, int m) {
int[][] dp = new int[A.length][m + 1];
for (int j = 1; j < m + 1; j++) {
if (j == A[0]) {
dp[0][j] = A[0];
} else {
dp[0][j] = 0;
}
for (int i = 1; i < A.length; i++) {
if (j < A[