01背包的改进实现

居然没想到背包问题还可以这么实现,在空间复杂度上达到O(W)次,有点不可思议啊

 

比较简单,不解释了,debug一下就明白了

 

 

/**
 * 背包问题
* f[w]=max{ f[v],f[w-w[i]]+v[i]}
* 也就是f[w][i] = max{f[w][i],f[w-w[i]+v[i]}
* 时间复杂度O(VW) 空间复杂度O(W)
* 也就是改进了空间复杂度了 * * @author Joeson */ public class ZeroPackage { public static void main(String[] args) { int[] value = new int[]{12, 10, 20, 15, 20}; int[] weight = new int[]{2, 1, 3, 2, 2}; int W = 5; System.out.println(div(value, weight, 0, W)); System.out.println(knapsack(value, weight, W)); } /** * 非递归实现 */ private static int knapsack(int[] v, int[] w, int W) { int[] tmp = new int[W + 1]; for (int i = 0; i < v.length; i++) { for (int j = W; j >= 1; j--) { tmp[j] = j - w[i] >= 0 ? Math .max(tmp[j], tmp[j - w[i]] + v[i]) : tmp[j]; } } return tmp[W]; } /** * 递归实现 */ private static int div(int[] v, int[] w, int index, int W) { if (W <= 0 || index >= v.length) { return 0; } int val2 = div(v, w, index + 1, W); int val1 = W >= w[index] ? div(v, w, index + 1, W - w[index]) + v[index] : val2; return Math.max(val1, val2); } }

 

 

 

 

 

你可能感兴趣的:(算法,Java,背包问题,DP,改进,Java,算法)