背包问题趣事
今天快下班的时候,有一大学同学发过来一个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
被同学膜拜了好久,唉,我想这就是程序员的乐趣所在吧。