首页  ·  知识 ·  编程语言
从N个数中取出任意个数,求和为指定值的解
网友   http://blog.csdn.net/min_jie/archive/2009/03/07/3966867.aspx  .NET  编辑:德仔   图片来源:网络
从N个数中取出任意个数,求和为指定值的解 收藏 题目来自CSDN的帖子: &q
  从N个数中取出任意个数,求和为指定值的解 收藏
 题目来自CSDN的帖子:
原题是这样的:
任意给一数组,如{-10,45,35,99,10,6,9,20,17,18}
再任意给一个值,如35.
请从上面的数组中找出所有的组合,使他们的和等于35.
例如对于上面的数组,所有的组合情况为:
35;
-10+45;
17+18;
6+9+20;
-10+35+10;
-10+17+18+10;
-10+6+9+20+10;
注意,每一种组合中一个数只能出现一次。
数组共有N个元素,那么我们可以用1到2^N的二进制来求解,若二进制数该位置是1,则将其取出求和。
检查和是否等于所求,是则输出。此题则是从0000000001一直循环到1111111111即可。
具体代码如下:
view plaincopy to clipboardprint?
static void Main(string[] args)//调用  
{  
    int[] array={-10,45,35,99,10,6,9,20,17,18};  
    CalSum(array, 35);  
}  
 
 
static void CalSum(int[] array, int result)  
{  
    for (int i = 1; i < 1 << array.Length; i++)//从1循环到2^N  
    {  
        int sum=0;  
        string temp = "";  
        for (int j = 0; j < array.Length; j++)  
        {  
            if ((i & 1 << j) != 0)//用i与2^j进行位与运算,若结果不为0,则表示第j位不为0,从数组中取出第j个数  
            {  
                sum += array[j];  
                temp += array[j] + "+";  
            }  
        }  
        if (sum == result) Console.WriteLine(temp.TrimEnd('+'));//如果和为所求,则输出  
    }  
 
本文作者:网友 来源: http://blog.csdn.net/min_jie/archive/2009/03/07/3966867.aspx
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读