1

C++ の問題について助けが必要です。ユーザーは入力したい数字の数を入力し、次にすべての数字と特別な値を入力します。プログラムは、合計が特別な値に等しい数字のすべての組み合わせを見つけて書き込む必要があります。例:

入力

12
1 5 7 3 10 8 9 2 4 6 11 13
15

出力:

4 11
2 13
9 6
9 2 4
3 2 4 6
3 8 4
3 10 2
7 2 6
7 8
5 4 6
5 8 2
5 10
5 7 3
1 8 6
1 8 2 4
1 10 4
1 3 11
1 3 9 2
1 7 3 4
1 5 9
1 5 3 6
1 5 3 2 4
1 5 7 2

コード

2 つの要素で構成されるすべての組み合わせを記述するコードは次のとおりです。

#include <iostream> 
using namespace std;

int main(int argc, const char * argv[])
{
    int size;
    cout << "Enter size: ";
    cin >> size;
    int *numbers = new int[size];
    cout << "Enter numbers: ";
    for (int i = 0; i < size; i++)
        cin >> numbers[i];
    int target;
    cout << "Enter target: ";
    cin >> target;
    int sum = 0;
    for (int i = 0; i < size-1; i++)
    {
        for (int j = i+1; j < size; j++)
        {
            sum = numbers[i];
            sum += numbers[j];
            if (sum == target)
                cout << numbers[i] << " " << numbers[j] << "\n";
        }
    }
    return 0;
}

その for ループを次のループに置き換えると、プログラムは 3 つの要素で構成されるすべての組み合わせを書き込みます。

for (int i = 0; i < size-2; i++)
{
   for (int j = i+1; j < size-1; j++)
   {
      for (int k = j+1; k < size; k++)
      {
         sum = numbers[i] + numbers[j];
         sum += numbers[k];
         if (sum == target)
         cout << numbers[i] << " " << numbers[j] << " " << numbers[k] << "\n";
       }
    }
}

これが私の質問です。考えられるすべての組み合わせを書き込むプログラムを作成するにはどうすればよいですか?

4

1 に答える 1

1
  1. リストから最初の数字を取得します (例: 1)。
  2. この番号をリストから削除し、「目的地」の合計から差し引きます。
  3. これで、新しいリストと新しい目的地の合計ができました。繰り返す。
  4. 合計が目的地を超える場合は、現在の数をスキップして (つまり、リスト内の数を保持し、目的地を更新しないでください)、次の目的地に移動します。
  5. リストの残りの項目で目的地に到達できない場合は、最後に追加した数字を目的地の合計にポップし、リストの次の数字で更新します。
  6. 目的の合計に達すると、元のリストの数値のサブセット (1 からリスト内の要素数までのサイズ) が合計され、意図した合計になります。
于 2012-11-16T14:16:44.803 に答える