您能否帮助我了解如何使用 +- 运算符找到从 1 到 N 的一组给定数字的所有可能组合 [重复]

Posted

技术标签:

【中文标题】您能否帮助我了解如何使用 +- 运算符找到从 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 [duplicate] 【发布时间】:2022-01-06 01:25:10 【问题描述】:

给定输入:N = 6,X = 3

输出应该是:

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

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

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

到目前为止,我可以做到这一点:

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

还有一个为 +- 生成所有可能组合的函数,但问题是我想将 +- 结果字符串与从 1 到 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;
        

【问题讨论】:

要搜索的词是“Permutations” 为什么不考虑包含-1的组合?所有其他值都可以是负数,为什么不是1。例如-1-2+3+4+5-6 也等于3 您并不是真正追求常规意义上的“置换”。这可以被认为是“nCr”,其中 r=N-1,n=2*r,以及一个 r + 和 r - 的桶,但有一个更简单的方法:“二进制" - 请参阅下面的答案 也许你不需要用 chars 来做,只要有一个 6 个数字的数组,都是正数,然后对它们求和并检查答案,然后进行一个过程,将第一个数字乘以-1,求和并检查,然后将第一个和第二个乘以-1,求和,然后再次将第一个乘以-1并检查,然后执行第一个/第二个/第三个,然后执行第一个,第一个/第二个/第三个,第一个/第二/第三/第四...就像以二进制计数:0000(没有乘以-1),0001(第一个是* -1),0010,(第一和第二),0011(第一),0100(第一/ sec/thir)、0101、0110、0111 等 +- 的所有组合 或者,如果它让您更容易想到,有一个从 0 到 2^6 的递增数字,对从 0 到 5 的每个数字进行位移,并检查结果是否为奇数。如果是,则数组中的数字索引需要翻转为自身的负数。每次从一个正数数组开始 【参考方案1】:

这看起来像是一种非常不同的“置换”形式。对于 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

【讨论】:

以上是关于您能否帮助我了解如何使用 +- 运算符找到从 1 到 N 的一组给定数字的所有可能组合 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

开发人员应该了解哪些有用的按位运算符代码技巧? [关闭]

如何通过主 ID 以外的列从 DynamoDB 检索数据

如何提高 iPhone 中 OCR 文本的质量

AWS现场定价如何运作?

如何从 OTF、TTF 文件中查找字体版本

您能否以编程方式获取 AWS MFA 序列号?