背包问题
首先给你两个数组w和v表示货物的重量和价值
每种货物的数量1。
重量和价值都是大于等于0的。
还有一个参数int bag表示背包有多大。
返回在不超过背包容量的最大价值
想法:尝试!!-》动态
从左往右依次尝试
假设有三个货物
暴力枚举,最佳方案肯定在其中。要做的就是将这种想法,变成递归的版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
public class test { public static int knapsack(int[] w,int[] v,int bag){ if(w.length!=v.length || w.length==0||v.length==0||bag<0){ return 0; } return process(w,v,0,bag); } public static int process(int[] w,int[] v, int index,int bag){ if(bag<0){ return -1; } if(index==w.length){ return 0; } int p1 = process(w,v,index+1,bag); int next = process(w,v,index+1,bag-w[index]); int p2 = 0; if(next != -1){ p2 = v[index] + next; } return Math.max(p1,p2); } public static void main(String[] args) { int[] w = {1,2}; int[] v = {3,4}; int bag = 2; int result = knapsack(w,v,bag); System.out.println(result);
} }
|