0-1 背包问题

使用贪心思想,优先放入平均价值最高的物品? 这能够得到一个局部最优解,不一定是一个全局最优解。 无法解决这个问题
**
因为这道题存在两个变量。一个是容量。 一个是价值。 所以我们设置一个F(N,C)表示吧N个物品放入到C容量的背包里面,使得这个价值是最大的。
需要一个二维的数组来放里面的数组, 数组的大小是 N* C+1。横过来的表示每一个物品的坐标, 竖下来的是背包的容量。我们需要这根儿物品的重量要小于背包的容量才可以放进去。

// 递归的写法public class Knapsack01 {public int knapsack01(int[] w,int[] v, int c){int n = w.length;int[][] memo = new int[n][c+1];return bestValue(w, v, n-1, c,memo);}// 用[0... index] 中的物品,填充容积为C的背包的最大价值private int bestValue(int[] w, int[] v, int index, int c,int[][] memo) {if(index<0 || c <= 0){return 0;}if(memo[index][c]!= 0){return memo[index][c];}int res = bestValue(w,v,index-1,c, memo);if(c >= w[index]){res = Math.max(res,v[index]+bestValue(w,v,index-1,c-w[index],memo));}memo[index][c] = res;return res;}}
动态规划的写法:
public int knapsack01(int[] w,int[] v, int c){int n = w.length;int[][] memo = new int[n][c+1];if(n == 0){return 0;}for (int i = 0; i <= c; i++) {memo[0][i] = i>=w[0]? v[0]:0;}for (int i = 1; i < n; i++) {for (int j = 0; j <= c; j++) {memo[i][j] = memo[i-1][j];if(j >= w[i]){memo[i][j] = Math.max(memo[i][j],v[i]+memo[i-1][j-w[i]]);}}}return memo[n-1][c];}
