如何找到添加两个变量的所有可能组合,每个变量都附加到一个乘数,总和为一个给定的数字(cin)?

Posted

技术标签:

【中文标题】如何找到添加两个变量的所有可能组合,每个变量都附加到一个乘数,总和为一个给定的数字(cin)?【英文标题】:How to find all possible combinations of adding two variables, each attached to a multiplier, summing up to a given number (cin)? 【发布时间】:2020-02-03 07:08:40 【问题描述】:

在我的情况下,一辆货车的容量为 30,而货车的容量为 10。我需要找到运输给定数量货物所需的货车/货车的数量,例如 100。我需要找到卡车 + 货车的所有可能组合,加起来为 100。

基本的数学计算是:(30*lorrycount) + (10*vancount) = n,其中 n 是货物数量。

输出示例

要运输的货物:100

货车数量:0 3 2 1

货车数量:10 1 4 7

例如,第二个组合是 3 辆货车,1 辆货车。考虑到货车的容量 = 30,货车容量 = 10,(30*3)+(10*1) = 100 = n。

目前,我们只有这段代码,它字面上找到所有加起来等于给定数字 n 的数字组合,而不考虑上面给出的公式。

#include <iostream>
#include <vector>
using namespace std;

void findCombinationsUtil(int arr[], int index,
    int num, int reducedNum)

    int lorry_capacity = 30;
    int van_capacity = 10;
    // Base condition 
    if (reducedNum < 0)
        return;

    // If combination is found, print it 
    if (reducedNum == 0)
    
        for (int i = 0; i < index; i++)
            cout << arr[i] << " ";
        cout << endl;
        return;
    

    // Find the previous number stored in arr[] 
    // It helps in maintaining increasing order 
    int prev = (index == 0) ? 1 : arr[index - 1];

    // note loop starts from previous number 
    // i.e. at array location index - 1 
    for (int k = prev; k <= num; k++)
    
        // next element of array is k 
        arr[index] = k;

        // call recursively with reduced number 
        findCombinationsUtil(arr, index + 1, num,
            reducedNum - k);
    



void findCombinations(int n)

    // array to store the combinations 
    // It can contain max n elements 
    std::vector<int> arr(n); // allocate  n elements

    //find all combinations 
    findCombinationsUtil(&*arr.begin(), 0, n, n);

int main()

    int n;
    cout << "Enter the amount of cargo you want to transport: ";
    cin >> n;
    cout << endl;
    //const int n = 10;
    findCombinations(n);

    return 0;

如果您有任何解决方案,请告诉我,谢谢。

【问题讨论】:

为什么是“1 lorry 8 vans”的解决方案?容量加起来不应该正好是 100 吗? 另外,您还没有提到这个问题是否有任何扩展?车辆类型以后会变成动态输入吗? 总是卡车和货车吗? @acraig5075 完全正确,不确定粘贴的组合是用户生成的还是预期的 @Botje 抱歉,我已经编辑了组合。不,不会有更多的车辆类型。那里只有货车和卡车。对不起这个错误 【参考方案1】:

寻找所有可能组合的迭代方式

#include <iostream>
#include <vector> 

int main()

    int cw = 100;
    int lw = 30, vw = 10;

    int maxl = cw/lw;  // maximum no. of lorries that can be there
    std::vector<std::pair<int,int>> solutions;    

    // for the inclusive range of 0 to maxl, find the corresponding no. of vans for each variant of no of lorries
    for(int l = 0; l<= maxl; ++l)
        bool is_integer = (cw - l*lw)%vw == 0; // only if this is true, then there is an integer which satisfies for given l

        if(is_integer)
            int v = (cw-l*lw)/vw; // no of vans
            solutions.push_back(std::make_pair(l,v));
        
    

    for( auto& solution : solutions)
        std::cout<<solution.first<<" lorries and "<< solution.second<<" vans" <<std::endl;
    
    return 0;

【讨论】:

【参考方案2】:

我们将创建一个递归函数,从左到右遍历全局 capacities 数组并尝试将货物加载到各种车辆类型中。我们跟踪我们仍然需要加载多少并将其传递给任何递归调用。如果我们到达数组的末尾,则仅当剩余货物为零时才产生解决方案。

std::vector<int> capacities =  30, 10 ;
using Solution = std::vector<int>;
using Solutions = std::vector<Solution>;

void tryLoad(int remaining_cargo, int vehicle_index, Solution so_far, std::back_insert_iterator<Solutions>& solutions) 
    if (vehicle_index == capacities.size()) 
        if (remaining_cargo == 0) // we have a solution
            *solutions++ = so_far;
        return;
    
    int capacity = capacities[vehicle_index];
    for (int vehicles = 0; vehicles <= remaining_cargo / capacity; vehicles++) 
        Solution new_solution = so_far;
        new_solution.push_back(vehicles);
        tryLoad(remaining_cargo - vehicles * capacity, vehicle_index + 1, new_solution, solutions);
    

如下调用它应该在all_solutions中产生所需的输出:

Solutions all_solutions;
auto inserter = std::back_inserter(all_solutions)
tryLoad(100, 0, Solution, inserter);

【讨论】:

我运行了程序,没有输出 需要打印all_solutions的内容才能真正得到输出。它是一个std::vector&lt;std::vector&lt;int&gt;&gt;,所以你需要一个双重嵌套的for 循环。

以上是关于如何找到添加两个变量的所有可能组合,每个变量都附加到一个乘数,总和为一个给定的数字(cin)?的主要内容,如果未能解决你的问题,请参考以下文章

添加逗号,变量名作为后缀

vbscript 整理两个变量以输出所有可能的组合

为组合图添加一个包含所有变量的图例

如何附加多个具有相同变量名的 .mat 文件?

VBA - 写入4列数据的所有可能组合[重复]

将相同的字符串附加到PowerShell中CSV列中的所有变量