C# 寻找等于给定和的所有可能的正数和负数组合

C# 寻找等于给定和的所有可能的正数和负数组合,c#,algorithm,C#,Algorithm,如果你想知道有多少种方法可以将1到N的数字组合在一起,通过使用加法或减法,你将得到与给定目标数字相等的组合,你会怎么做 关于这个话题,我无法以一种我可以达到我的结果的方式来修改它,所以我决定改问 示例:(假设N=8。如果我从1到N创建以下数组,我将如何解决这个问题。不要多次使用每个数字。) arr=[1,2,3,4,5,6,7,8] 总和=0 结果: +1+2+3+4-5-6-7+8 +1+2+3-4+5-6+7-8 +1+2-3+4+5+6-7-8 +1+2-3-4-5-6+7+8 +1

如果你想知道有多少种方法可以将1到N的数字组合在一起,通过使用加法或减法,你将得到与给定目标数字相等的组合,你会怎么做

关于这个话题,我无法以一种我可以达到我的结果的方式来修改它,所以我决定改问

示例:(假设N=8。如果我从1到N创建以下数组,我将如何解决这个问题。不要多次使用每个数字。)

  • arr=[1,2,3,4,5,6,7,8]
  • 总和=0
结果:

  • +1+2+3+4-5-6-7+8
  • +1+2+3-4+5-6+7-8
  • +1+2-3+4+5+6-7-8
  • +1+2-3-4-5-6+7+8
  • +1-2+3-4-5+6-7+8
  • +1-2-3+4+5-6-7+8
  • +1-2-3+4-5+6+7-8
  • -1+2+3-4+5-6-7+8
  • -1+2+3-4-5+6+7-8
  • -1+2-3+4+5-6+7-8
  • -1-2+3+4+5+6-7-8
  • -1-2+3-4-5-6+7+8
  • -1-2-3+4-5+6-7+8
  • -1-2-3-4+5+6+7-8
  • 解决方案总数:14

据我所知,如果我理解了这个问题,你需要一个
for
循环,因为如果你有一个数字
n
,有无数个数字的加或减等于
n
,所以你需要一个数字,如果达到这个数字,就会停止这个过程。 如果需要多个数字(例如3+10+1=14),则需要更多循环。 这将是我的出路:

int l = 50;//my limit
int n = 14;//my number
for(int i = 0; i < l; i++) 
        {
           for(int j = 0; j < l; j++) 
           {
                if ( i + j == n ) 
                {
                //Do whatever you want
                        Console.WriteLine("{0} = {1} + {2}", n, i, j);
                }
                if ( i - j == n ) 
                {
                //Do whatever you want
                       Console.WriteLine("{0} = {1} - {2}", n, i, j);
                }
         }
      }//Repeat for negative numbers
intl=50//我的极限
int n=14//我的号码
对于(int i=0;i

希望这会有所帮助。

这里有一个递归函数,它将打印所有有效的组合和无效的组合

代码(测试它,或更简单的版本):
//这段代码可以改进很多,但我认为它的编写方式更易于阅读和理解。
使用制度;
名称空间算法\u simple\u csharp
{
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“正在处理它!”);
int[]allNumbers=新的int[]{1,2,3,4};
int desiredSum=0;
//我们将创建两棵树,一棵第一个数字为正,另一棵为负
//正树
int initIndex=0;
OperationTreeNode firstPositiveNode=新OperationTreeNode
{
parentNode=null,
currentNumber=所有数字[initIndex],
累计总和=所有数字[initIndex],
操作=“+”
};
int totalSolutionsPositiveFirst=ApplyNumber(firstPositiveNode,allNumbers,initIndex+1,desiredSum);
//负树
OperationTreeNode firstNegativeNode=新OperationTreeNode
{
parentNode=null,
currentNumber=-allNumbers[initIndex],
累计总和=-allNumbers[initIndex],
操作=“-”
};
int totalSolutionsNegativeFirst=ApplyNumber(firstNegativeNode,allNumbers,initIndex+1,desiredSum);
//打印使用这两个树找到的所有解决方案
Console.WriteLine(“总解决方案:+(总解决方案正优先+总解决方案负优先));
}
//此函数将处理我们应该应用的下一个数字:allNumbers[索引]
//如果仍有数字要应用,它将创建两个节点,一个用于+allNumbers[index],另一个用于-allNumbers[index]
静态int ApplyNumber(OperationTreeNode currentNode,int[]allNumbers,int index,int desiredSum)
{
//基本情况下,没有更多的数字覆盖。
//在这种情况下,我们评估最后一个节点是否等于desiredSum
if(index>allNumbers.GetUpperBound(0))
{
如果(currentNode.AccumativeSum==desiredSum)
{

Console.WriteLine(currentNode.BranchToString()+“=”+currentNode.AccumativeSum+”迭代,以多少种方式达到目标

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine(C(0));
        int[] a = { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144 };
        Console.Write(C(0, a)); Console.Read();
    }

    static int C(int t)  // ±1 ± 2 ± 3 ± 4 == 0
    {
        int c = 0, s = 0;
        for (int n = 0; n < 16; n++)
        {
            if ((n & 1) == 0) s -= 1; else s += 1;
            if ((n & 2) == 0) s -= 2; else s += 2;
            if ((n & 4) == 0) s -= 3; else s += 3;
            if ((n & 8) == 0) s -= 4; else s += 4;
            if (s == t) c++; s = 0;
        } return c;
    }

    static int C(int t, int[] a)
    {
        int c = 0, s = 0, i, j = a.Length, n, m = 1 << j;
        for (n = 0; n < m; n++)
        {
            for (i = 0; i < j; i++)
                if ((n & 1 << i) == 0) s -= a[i]; else s += a[i];
            if (s == t) c++; s = 0;
        } return c;
    }
}
使用系统;
班级计划
{
静态void Main()
{
控制台写入线(C(0));
int[]a={1,4,9,16,25,36,49,64,81,100,121,144};
Console.Write(C(0,a));Console.Read();
}
静态int C(int t)/±1±2±3±4==0
{
int c=0,s=0;
对于(int n=0;n<16;n++)
{
如果((n&1)=0)s-=1;否则s+=1;
如果((n&2)=0)s-=2;否则s+=2;
如果((n&4)=0)s-=3;否则s+=3;
如果((n&8)=0)s-=4;否则s+=4;
如果(S=t)C++,S=0;
}返回c;
}
静态int C(int t,int[]a)
{

int c=0,s=0,i,j=a。Length,n,m=1对我来说似乎不太清楚。你要找的这个和是什么?如何计算?你如何使用显示的数组来获得“和”?你能澄清你给出的文章链接上给出的c#答案的“不正确”之处吗?经过编辑,示例中的目标是0。@luk不是那么简单g是不正确的,但我无法修改它,使其能够处理正数和负数。你需要写下问题的所有规则。根据你的规则,我可以用我想要的任何数字做任何事情,给出无限数或组合possible@CarlosGarcia嗯
Working on it!
1  + 2  + 3  + 4  = 10
1  + 2  + 3  - 4  = 2
1  + 2  - 3  + 4  = 4
1  + 2  - 3  - 4  = -4
1  - 2  + 3  + 4  = 6
1  - 2  + 3  - 4  = -2
1  - 2  - 3  + 4  = 0  <---   THIS ONE
1  - 2  - 3  - 4  = -8
-1  + 2  + 3  + 4  = 8
-1  + 2  + 3  - 4  = 0  <---   THIS ONE
-1  + 2  - 3  + 4  = 2
-1  + 2  - 3  - 4  = -6
-1  - 2  + 3  + 4  = 4
-1  - 2  + 3  - 4  = -4
-1  - 2  - 3  + 4  = -2
-1  - 2  - 3  - 4  = -10
Total soltions: 2
using System;
class Program
{
    static void Main()
    {
        Console.WriteLine(C(0));
        int[] a = { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144 };
        Console.Write(C(0, a)); Console.Read();
    }

    static int C(int t)  // ±1 ± 2 ± 3 ± 4 == 0
    {
        int c = 0, s = 0;
        for (int n = 0; n < 16; n++)
        {
            if ((n & 1) == 0) s -= 1; else s += 1;
            if ((n & 2) == 0) s -= 2; else s += 2;
            if ((n & 4) == 0) s -= 3; else s += 3;
            if ((n & 8) == 0) s -= 4; else s += 4;
            if (s == t) c++; s = 0;
        } return c;
    }

    static int C(int t, int[] a)
    {
        int c = 0, s = 0, i, j = a.Length, n, m = 1 << j;
        for (n = 0; n < m; n++)
        {
            for (i = 0; i < j; i++)
                if ((n & 1 << i) == 0) s -= a[i]; else s += a[i];
            if (s == t) c++; s = 0;
        } return c;
    }
}