最后找到了一种容易理解的01背包问题解法。
还是如何定义状态和状态转移方程
我们定义了一个二维int数组,[i+1][j]代表前A[i]个物品在不超过j容量下,能取到的最大值。
如果,第i个物品比当前容量大,则不放入A[i]物品,只用[i][j]即可;
如果,第i个物品小于等于当前容量,则要比较:
不放入A[i]物品时j容量能取得最大值,与,不放入A[i]物品时j-A[i]容量能取的最大值加A[i]的值,的大小
即不放A[i]时能取的最大值和放了A[i]能取的最大值,谁大
public int backPack(int m, int[] A) {
// write your code hereif (m == 0 || A == null || A.length == 0) {
return 0;
}
int [][] matrix = new int [A.length + 1][m + 1];
for (int i = 0; i < A.length; i++) {
for (int j = 0; j <= m; j++) {
if (A[i] > j) {
matrix[i + 1][j] = matrix[i][j];
} else {
matrix[i + 1][j] = Math.max(matrix[i][j], matrix[i][j - A[i]] + A[i]);
}
}
}
return matrix[A.length][m];
}
感谢此文作者的解法:
http://www.kancloud.cn/kancloud/data-structure-and-algorithm-notes/73067