/** * 背包问题<br/> * V[i][j]= <br/> * (1)max{V[i-1,j],vi+V[i-1,j-wi]} (j-wi >=0) <br/> * (2)V[i-1,j] (j-w1 < 0) * * <br/> * <br/> * 初始条件 : j>=0,V[0][j] = 0; i >=0,V[i][0] = 0 * * <br/> * O(nW) * * @author chenxuegui * */ public class Knapsack { // 物体价值和重量 static int[] weight; static int[] value; // 背包重量 static int W; static int[][] V; public static void main(String[] args) { value = new int[] { 12, 10, 20, 15 }; weight = new int[] { 2, 1, 3, 2 }; W = 5; V = new int[value.length + 1][W + 1]; init(V); System.out.println(knapsack(value.length, W)); } /** * 初始化 <br/> * 初始条件 : j>=0,V[0][j] = 0; i >=0,V[i][0] = 0 其余格为-1 * */ public static void init(int[][] V) { for (int i = 1; i < V.length; i++) for (int j = 1; j < W + 1; j++) { V[i][j] = -1; } } /** * * @param i * 第i个物件 * @param j * 包在第i物件中加入的物件之后剩下的能加入重量 * @return */ public static int knapsack(int i, int j) { if (V[i][j] < 0) { if (j < weight[i - 1]) { V[i][j] = knapsack(i - 1, j); } else { V[i][j] = Math.max(knapsack(i - 1, j), value[i - 1] + knapsack(i - 1, j - weight[i - 1])); } } return V[i][j]; } }
原文:http://blog.csdn.net/chenxuegui1234/article/details/18601901