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