进行特殊组合(C++)

Making special combinations (C++)

本文关键字:C++ 组合      更新时间:2023-10-16

我需要一些帮助来解决C++问题。用户输入他要输入的数字数,然后输入所有数字和一个特殊值。程序必须查找并写入总和等于特殊值的所有数字组合。例:

输入

121 5 7 3 10 8 9 2 4 6 11 1315

输出

4 112 139 69 2 43 2 4 63 8 43 10 27 2 67 85 4 65 8 25 105 7 31 8 61 8 2 41 10 41 3 111 3 9 21 7 3 41 5 91 5 3 61 5 3 2 41 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;
}

如果我用这个循环替换它,程序将编写由 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";
       }
    }
}

这是我的问题:如何制作一个编写所有可能组合的程序?

  1. 从列表中取第一个数字(例如,1)。
  2. 列表中删除此号码,并将其从"目的地"总数中扣除。
  3. 现在,您有一个新的列表和一个新的目标总计。 重复。
  4. 如果您的总数超过目的地,请跳过当前数字(即保留列表中的数字,不要更新目的地)并移至下一个数字。
  5. 如果列表中的其余项目都无法到达目的地,请弹出您添加到目的地总数中的最后一个数字,然后使用列表中的下一个数字更新它。
  6. 如果您达到目标总数,则原始列表中的数字子集(大小介于 1 和列表中的元素数之间)加起来就是您的预期总数。