在进行商务课作业时,我们使用 Excel 解决以下设置和条件的问题,但我想通过编写一些代码来找到解决方案C++这是我对某些学校课程最熟悉的。
我们有4家商店,我们需要投资1000万美元。主要条件是:
- 每家商店至少需要投资1mil。
- 4家门店的投资总额必须为1000万。
- 按照上述规则,一家商店最多可以投资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 时。
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_elements
,min_val
为 1,我们将生成{1,4}
、{2,3}
和{3,2}
对,其中每对中的第一个数字代表第一个元素,每对中的第二个数字是剩余组剩余的总和。
递归调用recursive_combinations
函数,使用第二个数字作为新sum
,num_elements - 1
作为新num_elements
,以查找剩余组的向量向量,并为返回向量中的每个向量,附加上述集合中的第一个元素。