如题,一个网友问的,我又去问其他的网友,再网上搜索,发贴问,最后终于解决,不过目前还没有明白为什么要这样写,以下是代码:
- class Program
- {
- static void Main(string[] args)
- {
- double[] numbers = new double[] { 258.5, 1229.1, 39.6, 660.3, 660, 660, 165, 165, 3060, 270, 4.8, 440, 279.06, 47.89, 38.02, 600, 286, 63.36, 1530, 1320, 1344, 3954 };
- Console.WriteLine("原数列:258.5,1229.1,39.6,660.3,660,660,165,165,3060,270,4.8,440,279.06,47.89,38.02,600,286,63.36,1530,1320,1344,3954\n\n");
- SumFinder.FindSum(numbers, 7785.52);
- // SumFinder.FindSum(new double[]{1,2,2,3,5}, 10);
- }
- }
- static class SumFinder
- {
- public static void FindSum(double[] numbers, double targetSum)
- {
- int elementCount = numbers.Length;
- int lastCombination = 2 << elementCount - 1;
- int firstCombination = 1;
- double sum;
- for (int i = firstCombination; i <= lastCombination; i++)
- {
- sum = 0;
- for (int pos = 0; pos < elementCount; pos++)
- {
- if ((i & (1 << pos)) != 0) //当前组合第pos个数是否取中
- sum += numbers[pos];
- }
- if (sum == targetSum)
- {
- string str = "";
- for (int pos = 0; pos < elementCount; pos++)
- {
- if ((i & (1 << pos)) != 0)
- {
- str += numbers[pos]+" + ";
- }
- }
- Console.Write(str.Substring(0,str.Length-3)+" = " + targetSum);
- Console.WriteLine();
- }
- }
- Console.WriteLine("结束");
- Console.ReadLine();
- }
- }