假设我们需要列出四个数字A,B,C和D. A + B + C + D之和为10,每个数字的值在[0,10]范围内。
找到所有可能的组合。
蛮力方式如下:
for (int A = 0; A <=10; ++A)
for (int B = 0; B <=10-A; ++B)
{
if (A + B > 10) break;
for (int C = 0; C <=10-A-B; ++C)
{
if (A + B + C > 10) break;
for (int D = 0; D <=10-A-B-C; ++D)
{
if (A + B + C + D == 10)
{
cout << "A: " << A << ",B: " << B << ",C: " << C << ",D: " << D << endl;
break;
}
else if (A + B + C + D > 10)
break;
}
}
}
Q&GT;有更好的解决方案吗?
仅供参考:根据@rici
的建议更新代码答案 0 :(得分:0)
您要求的方法是枚举partitions of an integer。链接的维基百科页面提供了一些方法。
答案 1 :(得分:0)
这样的事情:
void print4Partitions(int num) {
for (int A=1; A<num-3; A++) {
for (int B=A+1; B<num-A-2; B++) {
for (int C=B+1; C<num-(A+B)-1; C++) {
int D = num-A-B-C;
printf("%d %d %d %d\n", A, B, C, D);
}
}
}
}
这里的主要想法是:
A
,B
,C
和数字到是分区唯一确定D
。break
语句,这样可以提高代码速度。