硬币兑换的贪婪算法c++

Greedy Algorithm for coin change c++

本文关键字:算法 c++ 贪婪 硬币      更新时间:2023-10-16

因此,我正在创建一个硬币兑换算法,该算法采用值N和任何面额,如果它没有1,我必须自动包含1。我已经这样做了,但有一个缺陷,现在我有2个矩阵,我需要使用其中的1个。是否可以重写S[i]矩阵,同时仍然增加数组的大小。。。。此外,我如何才能找到最大面额和第二高面额,并一直保持到最小面额?我应该从最高到最低来分类,让它更容易吗?还是有一种更简单的方法来一个接一个地寻找它们?

int main()
{
    int N,coin;
    bool hasOne;
    cout << "Enter the value N to produce: " << endl;
    cin >> N;
    cout << "Enter number of different coins: " << endl;
    cin >> coin;
    int *S = new int[coin];
    cout << "Enter the denominations to use with a space after it" << endl;
    cout << "(1 will be added if necessary): " << endl;
    for(int i = 0; i < coin; i++)
    {
        cin >> S[i];
        if(S[i] == 1)
        {
            hasOne = true;
        }
        cout << S[i] << " ";
    }
    cout << endl;
    if(!hasOne)
    {
        int *newS = new int[coin];
        for(int i = 0; i < coin; i++)
        {
            newS[i] = S[i];
            newS[coin-1] = 1;
            cout << newS[i] << "  ";
        }
        cout << endl;
        cout << "1 has been included" << endl;
    }
    //system("PAUSE");
    return 0;
}

您可以用std::vector实现它,然后只需要使用push_back

std::sort可以用于按降序对面额进行排序,然后只需检查最后一个是否为1,如果缺少则添加即可。(这段代码中缺少很多错误检查,例如,您可能应该检查没有面额>=0,因为您使用的是有符号整数)。

#include <iostream>   // for std::cout/std::cin
#include <vector>     // for std::vector
#include <algorithm>  // for std::sort
int main()
{
    std::cout << "Enter the value N to produce:n";
    int N;
    std::cin >> N;
    std::cout << "Enter the number of different denominations:n";
    size_t denomCount;
    std::cin >> denomCount;
    std::vector<int> denominations(denomCount);
    for (size_t i = 0; i < denomCount; ++i) {
        std::cout << "Enter denomination #" << (i + 1) << ":n";
        std::cin >> denominations[i];
    }
    // sort into descending order.
    std::sort(denominations.begin(), denominations.end(),
        [](int lhs, int rhs) { return lhs > rhs; });
    // if the lowest denom isn't 1... add 1.
    if (denominations.back() != 1)
        denominations.push_back(1);
    for (int coin: denominations) {
        int numCoins = N / coin;
        N %= coin;
        if (numCoins > 0)
            std::cout << numCoins << " x " << coin << 'n';
    }
    return 0;
}

现场演示:http://ideone.com/h2SIHs