Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 列出所有可能的和为常数的数字组合的快速方法_Algorithm - Fatal编程技术网

Algorithm 列出所有可能的和为常数的数字组合的快速方法

Algorithm 列出所有可能的和为常数的数字组合的快速方法,algorithm,Algorithm,假设我们需要列出四个数字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) brea

假设我们需要列出四个数字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;
    }
   }
  }

for(int A=0;A您正在请求一种方法来枚举。链接的wikipedia页面列出了几种方法。

类似这样的方法如何:

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);
            }
        }
    }
}
void print4分区(int num){

对于(int A=1;使用7,1,1,1计数还是数字需要唯一?1,2,3,4是否被视为与2,1,3,4相同?也许这无关紧要?要搜索的短语是“整数分割”(或者“合成”,如果您关心顺序的话)大多数定义都不包含零,但这很容易解决。首先,很明显,您可以替换(int D=0;D)的
,因为顺序是[a,B,C,D]@q:你不需要那些
if
语句,因为它们反映了前面
for
语句中的条件。而且你仍然不必要地从
0
迭代
D
,直到它达到唯一可能的值。但是你几乎做到了。据我所知,这段代码只会给出{1 2 3 4},因为它不允许重复的数字,例如{2 2 4}。你也假设顺序不重要,例如{1 3 2 4},OP在评论中说是这样的。尽管项目符号点很好。