求解0/1背包问题
动态规划代码实现如下:
package algorithm;
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] v = new int[] { 0, 4, 5, 10, 11, 13 };
int[] w = new int[] { 0, 3, 4, 7, 8, 9 };
int W = 17;
int[][] f = new int[v.length][W + 1];
int[] path = new int[f.length];
int maxV;
maxV = solve(f, v, w, W, path);
for (int i = 1; i < v.length; i++) {
if (path[i] == 1) {
System.out.println("选择物品:" + i);
}
}
System.out.println(maxV);
}
public static int solve(int[][] f, int[] v, int[] w, int W, int[] path) {
for (int i = 1; i < v.length; i++) {
for (int spareW = 1; spareW <= W; spareW++) {
if (w[i] > spareW) {// 不能装下当前物品
f[i][spareW] = f[i - 1][spareW];
} else {// 能装下当前物品
f[i][spareW] = Math.max(f[i - 1][spareW], (f[i - 1][spareW - w[i]] + v[i]));
//f[i - 1][spareW]为不放入物品i的最大价值
//f[i - 1][spareW - w[i]] + v[i]为放入i的最大价值
}
}
}
return traceBack(f, v, w, W, path);
}
//回推二维矩阵,找出被选中物品,返回最大价值
public static int traceBack(int[][] f, int[] v, int[] w, int spaceW, int[] path) {
int maxV = 0;
for (int i = f.length - 1; i >= 1; i--) {
if (f[i][spaceW] == f[i - 1][spaceW]) {
path[i] = 0;
} else {
path[i] = 1;
maxV += v[i];
spaceW -= w[i];
}
}
return maxV;
}
}
程序运行结果:
以下是二维矩阵填表结果: