# 有1，2，3，4，5 这几个数，他们之间相加得10的结果有哪些

0
[已解决问题] 解决于 2012-01-17 15:02

3+6＝9

3+3+3＝9

4+5＝9

0

`            int[] numbers = new int[] { 1, 2, 3, 4, 5 };            int elementCount = numbers.Length;            int lastCombination = 2 << elementCount - 1;            int firstCombination = 1;            int sum;            const int targetSum = 10;            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)                {                    for (int pos = 0; pos < elementCount; pos++)                        if ((i & (1 << pos)) != 0)                             Console.Write("{0}\t", numbers[pos]);                    Console.WriteLine();                }            }            Console.ReadLine();`

ChatinCode | 老鸟四级 |园豆：2272 | 2012-01-17 13:23
`    static class SumFinder    {        public static void FindSum(dynamic numbers, dynamic targetSum)        {            int elementCount = numbers.Length;            int lastCombination = 2 << elementCount - 1;            int firstCombination = 1;            dynamic 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)                {                    for (int pos = 0; pos < elementCount; pos++)                        if ((i & (1 << pos)) != 0)                             Console.Write("{0}\t", numbers[pos]);                    Console.WriteLine();                }            }            Console.ReadLine();        }    }//调用方法            SumFinder.FindSum(new double[] { 0.5, 0.1, 0.6, 0.3, 0.8, 0.06, 0.89, 0.02, 0.36 }, 0.52);            SumFinder.FindSum(new int[] { 1, 2, 3, 4, 5 }, 10);`

ChatinCode | 园豆：2272 (老鸟四级) | 2012-01-17 14:21

@ChatinCode: 这个可以正常运行了。可以得到最后的答案了。。呵呵。。如果可以的话加以解释一下就好了。。

`&符号和<<符号好像是用于位运算位比较的吧。。呵呵。。做网站2年了都没有接触 过这些。。`

@牛腩: 最后这个代码少了些编译时的检查，因为使用了 dynamic。

ChatinCode | 园豆：2272 (老鸟四级) | 2012-01-17 15:07

@ChatinCode: 我自己已经改为可以在VS2008上运行了的。。呵呵。。得仔细看看为什么这样子得。。。主要是不知道位运算的意思。。。。

@牛腩: 难道这个算法看不懂，你把这些数排成一排，因为是组合问题，就是说这些数中要取到的数可以标记为1，未取到的可标为0。这样不就对应了0到2的n次方-1的二进制数(n为数的个数)，这些组合中取0个数的显然不行。i & (1 << pos)是取 i 的第 pos位数(二进制)。<< 二进制左移 ， & 二进制与。不知道够明白吗??

ChatinCode | 园豆：2272 (老鸟四级) | 2012-01-18 09:27

0

`        static void Main(string[] args)        {            var numbers = new []{ 1, 2, 3, 4, 5 };            int total = 10;            FindCombinations(numbers, total);            results.ForEach(r => Console.WriteLine(string.Join(",", r)));            Console.Read();        }        static List<int[]> results = new List<int[]>();        static Stack<int> currentResult = new Stack<int>();        static void FindCombinations(int[] numbers, int total)        {            if (numbers.Length == 0 && total == 0)            {                results.Add(currentResult.ToArray());            }            else            {                for (int i = 0; i < numbers.Length; i++)                {                    var j = i;                    currentResult.Push(numbers[j]);                    FindCombinations(numbers.Skip(j + 1).ToArray(), total - numbers[j]);                    currentResult.Pop();                }            }        }`

0

lonely_rain | 园豆：752 (小虾三级) | 2012-01-17 13:16

您需要登录以后才能回答，未注册用户请先注册