用C++中的数字和条件填充向量



在进行商务课作业时,我们使用 Excel 解决以下设置和条件的问题,但我想通过编写一些代码来找到解决方案C++这是我对某些学校课程最熟悉的。

我们有4家商店,我们需要投资1000万美元。主要条件是:

  1. 每家商店至少需要投资1mil。
  2. 4家门店的投资总额必须为1000万。
  3. 按照上述规则,一家商店最多可以投资700万

根据每家商店的投资金额,每家商店都有自己独特的投资回报百分比。 换句话说,通过投资每家商店可以获得大量的组合。只要每个组合的总数为 10 个,数字的重复并不重要,但数字的顺序确实很重要。

如果我的数学是正确的,组合的总数是 7^4 = 2401,但工作解决方案的数量 由于每个组合必须等于 10 作为总和的条件,因此较小。

我在C++中尝试做的是使用循环用 4 个数字填充每行,使它们的总和等于 10(百万(,例如:

7 1 1 1

17 1 1

1 17 1

1 11 7

6 2 1 1

6 1 2 1

6 1 1 2

5 3 1 1

5 1 3 1

5 1 1 3

5 1 2 2

5 2 1 2

5 2 2 1

我将不胜感激有关如何解决此问题的建议。仍然不太确定在使用数组时使用循环是否是一个好主意(也许是 2D 数组/矢量?我有一个模糊的想法,也许递归函数会促进解决方案。

感谢您花一些时间阅读,我感谢提出解决方案的任何和所有建议。

编辑: 这是我处理的一些代码,只是随机化 50 行数字。仍然必须实现有效行组合必须是 4 之间的 10 之和的条件;

int main(){
const int rows = 50;
int values[rows][4];
for (int i = 0; i < 50; i++) {
for (int j = 0; j <= 3; j++){
values[i][j]= (rand() % 7 + 1);
cout << values[i][j] << " ";
}
cout << endl;
}
}

您可以递归计算。对于每个级别,您都有:

  1. 目标总和
  2. 该级别中的元素数
  3. 每个元素可以具有的最小值

首先,我们确定返回类型。您的最终输出是什么?对我来说看起来像一个矢量的矢量。因此,我们的递归函数将返回相同的内容。

其次,我们确定退化情况的结果(在递归的"底部"(,当该级别的元素数为 1 时。

std::vector<std::vector<std::size_t>> recursive_combinations(std::size_t sum, std::size_t min_val, std::size_t num_elements)
{
std::vector<std::vector<std::size_t>> result {};
if (num_elements == 1)
{
result.push_back(std::vector<std::size_t>{sum});
return result;
}
...non-degenerate case goes here...
return result;
}

接下来,我们确定当此级别包含 1 个以上元素时会发生什么。将总和分成"第一个"元素和"剩余"组的所有可能对。例如,如果我们的目标sum为 5、3num_elementsmin_val为 1,我们将生成{1,4}{2,3}{3,2}对,其中每对中的第一个数字代表第一个元素,每对中的第二个数字是剩余组剩余的总和。

递归调用recursive_combinations函数,使用第二个数字作为新sumnum_elements - 1作为新num_elements,以查找剩余组的向量向量,并为返回向量中的每个向量,附加上述集合中的第一个元素。

最新更新