在 C++ 中使用数字和条件填充向量
Posted
技术标签:
【中文标题】在 C++ 中使用数字和条件填充向量【英文标题】:Populating a vector with numbers and conditions in C++ 【发布时间】:2020-02-15 00:55:49 【问题描述】:我们正在使用 Excel 解决具有以下设置和条件的问题,但我想通过用 C++ 编写一些代码来找到解决方案,这是我在一些学校课程中最熟悉的.
我们有 4 家商店需要投资 1000 万美元。主要条件是:
每家店铺至少要投资100万。 4家店的投资总和要1000万。 按照以上规则,单店最多可投资700万
根据每家商店的投资金额,每家商店都有自己独特的投资回报百分比。 也就是说,每家店铺的投资,都可以获得大量的组合。只要每个组合的总数为 10,数字的重复无关紧要,但数字的顺序很重要。
如果我的数学是正确的,那么组合的总数是 7^4 = 2401,但是工作解决方案的数量 由于每个组合的总和必须等于 10,因此较小。
我在 C++ 中尝试做的是使用循环来用 4 个数字填充每一行,使得它们的总和等于 10(百万),例如:
7 1 1 1
1 7 1 1
1 1 7 1
1 1 1 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
我很感激有关如何解决此问题的建议。仍然不太确定在使用数组时使用循环是否是一个好主意(也许是二维数组/向量?)我有一个模糊的想法,也许递归函数会促进解决方案。
感谢您花时间阅读,感谢您提出解决方案的所有建议。
编辑: 这是我处理的一些代码,仅用于随机化 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;
【问题讨论】:
每项投资是否需要被 100 万美元整除?最小的投资金额是多少? 每家商店的最小数量为 1(以百万计)。我们并没有真正处理数字的分数,因为我们将每个数量乘以一个单独的固定百分比投资表,但这是一个单独的问题。 我知道最小的数量是 100 万,但是可以在商店中投资 1,000,001 美元吗?有可能在一家商店投资 1,100,000 美元吗? 你有没有尝试过?有代码吗? 嗯,好的,答案是否定的。它要么投资 100 万,要么 2,3... 最多 7 个。你明白了。 【参考方案1】:您可以递归计算。对于每个级别,您都有:
-
目标总和
该级别的元素数量
每个单独元素可以具有的最小值
首先,我们确定我们的返回类型。你的最终输出是什么?对我来说看起来像是一个向量的向量。所以我们的递归函数会返回一个相同的值。
其次,我们确定退化情况的结果(在递归的“底部”),此时此级别中的元素数为 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、3 num_elements
和 min_val
为 1,我们将生成 1,4
、2,3
和 3,2
对,其中第一个数字每对用于第一个元素,每对中的第二个数字是剩余组的剩余总和。
使用第二个数字作为新的sum
,并将num_elements - 1
作为新的num_elements
递归调用recursive_combinations
函数,以找到剩余组的向量向量,以及返回向量中的每个向量, 追加上述集合中的第一个元素。
【讨论】:
以上是关于在 C++ 中使用数字和条件填充向量的主要内容,如果未能解决你的问题,请参考以下文章