/* w代表物品重量,v代表物品价值,c代表背包最大能容纳重量 res[i][j]代表背包可以选择前i个物品,最大容量为j时候的最大价值 res[i-1][j] if(w[i-1] > j) res[i][j] = max((res[i-1][j-w[i-1]]+v[i-1]), res[i-1][j]) else **/ public class Package01 { public int[][] getMaxValue(int[] w, int[] v, int c) { int n = w.length; int[][] res = new int[n+1][c+1]; for(int i = 0; i < n+1; i ++) { res[i][0] = 0; } for(int j = 0; j < c+1; j ++) { res[0][j] = 0; } for(int i = 1; i < n+1; i ++) { for(int j = 1; j < c+1; j++) { if(w[i-1] > j) { res[i][j] = res[i-1][j]; } else { res[i][j] = Math.max((res[i-1][j-w[i-1]]+v[i-1]), res[i-1][j]); } } } return res; } //反向找出选出的背包 public int[] select(int[][] res, int[] w, int c) { int n = w.length; int[] x = new int[n]; int j = c; for(int i = n; i > 0; i --) { if(res[i][c] > res[i-1][j]) { x[i-1] = 1; j -= w[i-1]; } } return x; } public static void main(String[] args) { int[] w = {2,3,4,5}; int[] v = {3,4,5,7}; int c = 10; Package01 p = new Package01(); int[][] res = p.getMaxValue(w, v, c); int[] x = p.select(res, w, c); for (int i : x) { System.out.print(i + " "); } } }
原文:http://www.cnblogs.com/masterlibin/p/5808396.html