背包问题趣事
今天快下班的时候,有一大学同学发过来一个excel,里面有54个数字,他问我能不能从这54个数字中找出n个数字,加起来刚好等于70708。刚开始就琢磨着用遍历算法来解决问题,想着想着感觉太晕了,复杂度太高了。灵感突然来袭,这不是在学校里面学过的典型的背包问题么,看来大学里面也不是什么都没有学到哈。知道了问题的出处,事情就好办了,下面直接上代码。
public class knapsacktest {
private static double[] heft = {
10.08 ,
111.75 ,
2865.52 ,
3535.02 ,
50.83 ,
103.60 ,
20.00 ,
179.20 ,
223.74 ,
125.46 ,
113.28 ,
29.60 ,
102.24 ,
274.92 ,
10.77 ,
49.28 ,
20.23 ,
148.32 ,
47.96 ,
129.00 ,
1595.70 ,
611.74 ,
43.01 ,
1585.84 ,
4775.04 ,
142.80 ,
3522.24 ,
52.53 ,
181.90 ,
88.88 ,
138.60 ,
157.00 ,
8.61 ,
91.08 ,
89.76 ,
23.76 ,
24.21 ,
50.83 ,
147.87 ,
16.62 ,
113.12 ,
433.61 ,
24.57 ,
44.22 ,
37.84 ,
2118.78 ,
108.80 ,
187.03 ,
132.48 ,
1365.24 ,
4956.12 ,
593.56 ,
3889.60 ,
9676.80 ,
11865.52 ,
10596.60 ,
11678.27 ,
5303.52 ,
918.81 ,
1911.87 ,
3138.24 ,
29.10 ,
1623.22 ,
6192.22
};
public static double knapsick(int index, double heftSum) {
if (index > heft.length - 1) {
return 0;
}
if(heftSum >= heft[index]) {
double result = knapsick(index + 1, heftSum - heft[index]);
if (result == heftSum - heft[index]) {
System.out.print(heft[index] + " ");
return heftSum;
}
}
return knapsick(index + 1, heftSum);
}
public static void main(String args[]) {
knapsick(0, 70708);
}
}
如下是结果:
6192.22 1623.22 3138.24 11678.27 11865.52 9676.8 4956.12 108.8 44.22 24.57 16.62 147.87 89.76 91.08 8.61 157.0 138.6 88.88 181.9 52.53 3522.24 142.8 4775.04 1585.84 43.01 611.74 1595.7 129.0 47.96 148.32 20.23 49.28 10.77 274.92 102.24 29.6 113.28 125.46 223.74 179.2 20.0 103.6 50.83 3535.02 2865.52 111.75 10.08
被同学膜拜了好久,唉,我想这就是程序员的乐趣所在吧。
浙公网安备 33010602011771号