1、0-1背包问题
//0-1背包问题--动态规划算法 public class DynamicPlan { public static void main(String[] args) { DynamicPlan dynamicplan = new DynamicPlan(); int[] weight = {1, 2, 3, 4, 5}; System.out.println("方法一 背包所装物品的重量为:" + dynamicplan.knapsack(weight, weight.length, 12)); System.out.println("方法二 背包所装物品的重量为:" + dynamicplan.knapsack2(weight, weight.length, 12)); } //方法一 weight:物品重量,n:物品个数,w:背包可承载重量 public int knapsack(int[] weight, int n, int w) { boolean[][] states = new boolean[n][w+1];//默认值false states[0][0] = true;//第一行的数据要特殊处理,可以利用哨兵优化 if(weight[0] <= w) { states[0][weight[0]] = true; } for(int i=1; i<n; i++) {//动态规划状态转移 for(int j=0; j<=w; j++) {//不把第i个物品放入背包 if(states[i-1][j] == true) { states[i][j] = states[i-1][j]; } } for(int j=0; j<=w-weight[i]; j++) {//把第i个物品放入背包 if(states[i-1][j] == true) { states[i][j+weight[i]] = true; } } } for(int i=w; i>=0; i--) {//输出结果 if(states[n-1][i] == true) { return i; } } return 0; } //方法二 weight:物品重量,n:物品个数,w:背包可承载重量 public int knapsack2(int[] weight, int n, int w) { boolean[] states = new boolean[w+1];//默认值false states[0] = true;//第一行的数据要特殊处理,可以利用哨兵优化 if(weight[0] <= w) { states[weight[0]] = true; } for(int i=1; i<n; i++) {//动态规划状态转移 for(int j=w-weight[i]; j>=0; j--) {//把第i个物品放入背包 if(states[j] == true) { states[j+weight[i]] = true; } } } for(int i=w; i>=0; i--) {//输出结果 if(states[i] == true) { return i; } } return 0; } }
2、0-1背包问题【升级版】