专注于中国的商业智能

导航

背包问题趣事

今天快下班的时候,有一大学同学发过来一个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

 

被同学膜拜了好久,唉,我想这就是程序员的乐趣所在吧。

posted on 2010-08-06 10:29  李梦蛟  阅读(705)  评论(3编辑  收藏  举报