2

4 つの数値 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> より良い解決策はありますか?

参考: コードは @rici からの提案に基づいて更新されます

4

2 に答える 2

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);
            }
        }
    }
}

ここでの主なアイデアは次のとおりです。

  • 最後の番号をループする必要は本当にありません。 @nci が言及しているようAに、BC、およびパーティションになる番号が一意に決定されるように、単純に計算できますD
  • breakステートメントをテストして使用する代わりに、ループを制限できます。これにより、コードが高速になります。
于 2013-03-14T16:48:09.817 に答える
0

integer のパーティションを列挙する方法を求めています。リンクされたウィキペディアのページには、それを行うためのいくつかの方法が示されています。

于 2013-03-14T04:01:06.083 に答える