在 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_elementsmin_val 为 1,我们将生成 1,42,33,2 对,其中第一个数字每对用于第一个元素,每对中的第二个数字是剩余组的剩余总和。

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

【讨论】:

以上是关于在 C++ 中使用数字和条件填充向量的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用 remove_if 过滤条件向量

有条件地并行填充向量

在 C++ 中并行查找向量的第一个

更改条件以替换向量中的元素

使用条件自动填充单元格

如何在 Excel 中以条件格式自动填充条件?