你能帮我提供一个线索,告诉我如何使用 +- 运算符找到从 1 到 N 的一组给定数字的所有可能组合吗

Can you please help me with a clue on how can I find all possible combinations for a given set of number from 1 to N, using +- operators

Given input: N = 6, X = 3

The output should be:

1 + 2 + 3 - 4 - 5 + 6 = 3

1 + 2 - 3 + 4 + 5 - 6 = 3

1 - 2 - 3 - 4 + 5 + 6 = 3

So far I could manage this:

    //returns a string of numbers from 1 to N
static string Numbers(int maxNumber) => maxNumber > 1 ? Numbers(maxNumber - One) + maxNumber :"1";

and a function that generates all possible combinations for +- but the problem is that I want to combine the +- resulted string with numbers from 1 to N:

static void Permute(char[] arry, int i, int n)
        {
            int j;
            if (i == n)
                Console.WriteLine(arry);
            else
            {
                for (j = i; j <= n; j++)
                {
                    Swap(ref arry[i], ref arry[j]);
                    Permute(arry, i + 1, n);
                    Swap(ref arry[i], ref arry[j]); //backtrack
                }
            }
        }

        static void Swap(ref char a, ref char b)
        {
            char tmp;
            tmp = a;
            a = b;
            b = tmp;
        }

这看起来像是一种非常不同的“置换”形式。对于 N 个整数,您需要做出 D=N-1 个决定,每个决定可以是 +-。两个选项是:“二进制”,所以,如果这是我,我会计算 (2^D)-1(这给了我们上限),然后从零到那个数字(包括)做一个 for 循环, 做数学运算:每个二进制数字都是一个决策点,我们可以说 0===-1===+;看看结果是什么:如果它是你想要的数字:记录它。

对于 N=6,我们有 D=5,并且有 32 次尝试; 0 到 31:

int N = 6, X = 3;

// how many decisions is that?
var decisions = N - 1;

// treat each -/+ as one of "decisions" binary digits
var binaryUpperLimit = (1 << decisions) - 1;
for (int i = 0; i <= binaryUpperLimit; i++)
{
    // compute the sum
    int sum = 1; // the 1 is a permenant fixture, it seems

    // determine each decision using binary arithmetic
    for (int place = 0; place < decisions; place++)
    {
        int digit = place + 2;
        if ((i & (1 << place)) == 0)
        {
            sum -= digit;
        }
        else
        {
            sum += digit;
        }
    }

    // is that what we wanted?
    if (sum == X)
    {
        // we have a "hit"; repeat the above to output this
        Console.Write("1");
        for (int place = 0; place < decisions; place++)
        {
            if ((i & (1 << place)) == 0)
            {
                Console.Write(" - ");
            }
            else
            {
                Console.Write(" + ");
            }
            int digit = place + 2;
            Console.Write(digit);
        }
        Console.Write(" = ");
        Console.WriteLine(sum);
    }
}

(如果初始的 1 可以为负数,则需要调整以添加额外的决定,从零开始求和,并使 digit 改为 +1 +2)