http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml
http://blog.csdn.net/woshioosm/article/details/7438834
关键在于辅助数组,记录某一个面值(容量)对应的零钱数量(宝石数量),辅助数组后面的值,通过前面的值计算出来
假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大
public static int maxcount(int[] moneyset,int[] weightset,int target){ //weightset重量 3,4,5 //moneyset价值 4,5,6 //values[] 位置代表容量,值代表最大价值 int[] values = new int[target+1]; int length = values.length; for(int i=0;i<length;i++){ values[i] = 0; } //初始赋值,最开始的三号 int init = weightset[0]; //从三号位开始有价值 values[init] = moneyset[0]; //往每个容量里填价值 for(int i=init+1;i<length;i++){ int maxcount = 0; //循环重量数组, for(int j=0;j<weightset.length;j++){ if(i-weightset[j]>=0){ int temp = values[i-weightset[j]] + moneyset[j]; if(temp>maxcount){ maxcount = temp; } } } values[i] = maxcount; } System.out.println(Arrays.toString(values)); return values[length-1]; }
找零问题
现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱
public static void getChange(int[] moneyset,int target){ int[] changes = new int[target+1]; for(int c:changes){ c = 0; } int length = changes.length; int init = moneyset[0]; changes[init]=1; for(int i=init+1;i<length;i++){ int min = Integer.MAX_VALUE; for(int j=0;j<moneyset.length;j++){ if(i==moneyset[j]){ min =1 ; break; }else if(i-moneyset[j]>0){ int temp = changes[i-moneyset[j]] + 1; if(temp<min){ min = temp; } } } changes[i] = min; } System.out.println(Arrays.toString(changes)); }