c# 如何将几个数字进行搭配相加,得出全排列组合

比如我这里有4个数字:2、3、4、6

我需要用随便几个数字搭配相加得出结果为全排列若干组合,请问如何写这样的代码?

2+3=5
2+4=6
2+6=12
2+3+4=9
2+3+4+6=15
2+3+6=11
2+4+6=12

3+4=7
3+6=9
3+4+6=13

4+6=10
我题目写的不太对,应该是:得到这4个数字的全排列相加

也就是得到各种排列组合之和。

(注意效率,可能数据会达到几千个)

 

  static int[] number;

  static int[] result;

  /// <summary>

  /// 应用程序的主入口点。

  /// </summary>

  [STAThread]

  static void Main(string[] args)

  {

   number = new int[] {2,3,4,6};

   result = new int[number.Length];

   Backtrace(0);

   System.Console.Read();

  }

  static void Backtrace(int i)

  {

   if (i >= number.Length)

   {

    //没有数字可选

    return;

   }

   result[i] = 1; //选中当前数字

   PrintResult(); //输出结果

   Backtrace(i+1); //选择下一数字

   result[i] = 0; //剔除当前数字   

   Backtrace(i+1); //选择下一数字

  }

  static void PrintResult()

  {

   int count = 0;

   int total = 0;

   string msg = "";

   for (int i = 0; i < result.Length; i++)

   {

    count += result[i];

    if (result[i] == 1)

    {

     if (count > 1)

     {

      msg += "+";

     }

     total += number[i];

     msg += number[i];

    }

   }

   if (count > 1)

   {

    System.Console.WriteLine(msg + "=" + total);

   }

  }

 

 

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-04
首先,你这个是组合,而不是排列
如果只求和:那么对于有n个数字的数组,2一共出现了n-1 + C 2/n-1 + C 3/n-1 + .... C n-2/n-1 + 1次,同理,其他数字在总和的算式中出现的次数和第一个数字2是一样的
你只需要计算

C 2/n-1 + C 3/n-1 + .... C n-2/n-1 + 1

将其和你输入的数组的和相乘就得到最终的值

你的例子中,和= (2+3+4+6)* (3 + C2/3+1) = 15*7 = 105

算法可能还可以简化, 不知道能不能简化成排列 A X/X的形式

至于代码就你自己写了,这道是纯算法题,和C++还是C#没什么大关系,排列组合的公式中学也都应该学到过,你自己搞定吧追问

可能是我没说得清楚。我需要的是每一组的排列求和,而不是总的求和。不过还是要感谢你!

追答

和FIBO数列一样,如果要追求遇到较大阶数的执行速度,递归这条路就死了(FIBO数列还有巧可取)
但你的题,如果要列出每一个组合,并且要求和
那么对1000个数字来说,每个数字都有两种选择(出现和不出现)
也就说2^1000种组合,这个数量级在10^301
什么地方的题? 这个题目如果没有描述错的话
和汉诺塔一样,阶数高了,运行到你死了也没有结果

追问

说的很对,估计无解了。必须加上其他条件(比如找到的数据就不参加运算)来减少数据量

第2个回答  2012-07-05
/// <summary>
/// 计算该数组从第m个数开始的所有组合
/// </summary>
/// <param name="s">数组</param>
/// <param name="m">从第m个数开始计算</param>
/// <param name="k">起始数据位第k个数</param>
static void CaM(int[] s, int m, int k)
{
for (int i = m; i < s.Length; i++)
{
int sum = 0;
for (int j = k; j < m; j++)
{
sum += s[j];
//System.Console.Write(s[j] + "+");
}
System.Console.Write("第" + k + "到" + (m - 1) + "+");
sum += s[i];
System.Console.WriteLine(s[i] + "=" + sum);
}
}
static void Main(string[] args)
{
int[] aaa = new int[500];//测试数组
for (int i = 0; i < aaa.Length; i++)
{
aaa[i] = i + 1;
}

for (int i = 0; i < aaa.Length; i++)//起始数据
{
for (int j = i + 1; j < aaa.Length; j++)//组合计算开始数据
{
CaM(aaa, j, i);
}
}
}
第3个回答  2012-07-04
路过追问

感谢大伙的回复!特别是yangquneng!计算是出来了,可惜加大数据(2000个数据)程序就死了。还有什么提高效率的方法么?谢谢!

c# 如何将几个数字进行搭配相加,得出全排列组合
\/\/没有数字可选 return;} result[i] = 1; \/\/选中当前数字 PrintResult(); \/\/输出结果 Backtrace(i+1); \/\/选择下一数字 result[i] = 0; \/\/剔除当前数字 Backtrace(i+1); \/\/选择下一数字 } static void PrintResult(){ int count = 0;int total = 0;string msg = "";for (int ...

C# 6个数字得出全部排列组合 写入listbox内
一个组合的数字可以重复的话就简单 一个数组循环6次 不可以重复的话就6个数组 每次挖掉用过的 也是6次循环

md5 算法程序+详细注释,高分求教!
有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后 再用目标的md5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是p(62,1)+p(62,...

斐波那契数列与音乐!!!
我们知道在钢琴的键盘上,从一个 C 键到下一个 C 键就是音乐中的一个八度音程(如图1) . 其中共包括13 个键,有8 个白键和5 个黑键 ,而 5 个黑键分成 2 组 ,一组有 2 个黑键 ,一组有 3 个黑键.2、3、5、8、13 恰好就是著名的斐波那契数列中的前几个数. 如果说斐波那契数在钢琴键上的出现...

数字怎么生成二维码?
二维码生成器的制作需要一个二维码生成算法,或者一个二维码插件,然后用JAVA,C#,VB等编程语言编写一个调用软件就可以做成二维码生成器了。 这个二维码生成算法就是将组成二维码的0、1数字矩阵进行组合,输入二维码生成器的信息不同,所得到的0、1数字矩阵组合也不相同,因此生成的二维码样式就各种各样。

相似回答