【问题标题】:Populating a vector with numbers and conditions in C++在 C++ 中使用数字和条件填充向量
【发布时间】:2020-02-15 00:55:49
【问题描述】:

我们正在使用 Excel 解决具有以下设置和条件的问题,但我想通过用 C++ 编写一些代码来找到解决方案,这是我在一些学校课程中最熟悉的.

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

  1. 每家店铺至少要投资100万。
  2. 4家店的投资总和要1000万。
  3. 按照以上规则,单店最多可投资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 个。你明白了。

标签: c++ arrays loops discrete-mathematics


【解决方案1】:

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

  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、3 num_elementsmin_val 为 1,我们将生成 {1,4}{2,3}{3,2} 对,其中第一个数字每对用于第一个元素,每对中的第二个数字是剩余组的剩余总和。

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

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2021-03-03
    相关资源
    最近更新 更多