zoukankan      html  css  js  c++  java
  • 在若干个整数中找到相加之和为某个整数的所有组合的算法

     给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,
    例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,
    它们的相加之和为4:4, 3+1, 2+2,2+1+1。

    我用c#实现的,定义了一个栈来存放符合条件的数据。代码如下.

     1   int a = 4;
     2   int[] iArr = new int[6] { 4, 3, 2, 2, 1, 1 };
     3   Stack<int> stack = new Stack<int>();
     4   private void Calc()
     5   {
     6       for (int i = 0; i < iArr.Length; i++)
     7       {
     8           if (iArr[i] == a)
     9           {
    10               //输出这个数
    11               continue;
    12           }
    13           else if (iArr[i] > a)
    14           {
    15               continue;
    16           }
    17           stack.Clear();
    18           stack.Push(iArr[i]);
    19           Func(i, a - iArr[i]);
    20       }
    21   }
    22 
    23   private void Func(int i, int iValue)
    24   {
    25       for (int j = i + 1; j < iArr.Length; j++)
    26       {
    27           if (iArr[j] > iValue)
    28           {
    29               continue;
    30           }
    31           else if (iValue == iArr[j])
    32           {
    33               stack.Push(iArr[j]);
    34               //输出stack 这一步略..
    35               stack.Pop();
    36           }
    37           else if (iValue > iArr[j])
    38           {
    39               stack.Push(iArr[j]);
    40               Func(j, iValue - iArr[j]);
    41               stack.Pop();
    42           }
    43       }
    44 
    45   }

    不过也是有一个问题,输出结果为:

    4
    3,1
    3,1
    2,2
    2,1,1
    2,1,1

     就是存在重复,暂时没什么好的方法解决。

  • 相关阅读:
    谨以此文纪念一周的心血历程
    面向对象初调用:foolish 电梯
    洛谷 1016 旅行家的预算
    洛谷 1514 引水入城
    洛谷 3178 树上操作
    洛谷 3811 【模板】乘法逆元
    洛谷 1156 垃圾陷阱
    洛谷 1363 幻想迷宫
    洛谷 1736 创意吃鱼法
    洛谷 1436 棋盘分割
  • 原文地址:https://www.cnblogs.com/benwu/p/1736112.html
Copyright © 2011-2022 走看看