貪心:錢幣找零問題(C++)


貪心是一種算法范例,它一點一點地構建解決方案,總是選擇下一個提供最明顯和最直接好處的部分。因此,選擇局部最優也會導致全局解的問題最適合貪心問題。 

例如,考慮分數背包問題。局部最優策略是選擇權重比最大的項。這個策略也導致了全局最優解。

 

假設1元、2元、5元、10元、20元、50元、100元的紙幣分別有a,b,c,d,e,f,g張。現在要用這些錢來支付m元,至少要用多少張紙幣?用貪心算法的思想,每一次選擇最大面值的錢幣。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> Num{ 3,0,2,1,0,3,5 }, Value{ 1,2,5,10,20,50,100 };

int BagsQues(int money) {
    int sum = 0;
    for (int i = Value.size() - 1; i >= 0; --i) {
        int N = min(money / Value[i], Num[i]);
        money = money - N * Value[i];
        sum += N;
        if (money == 0)
            return sum;
    }

    return -1;
}

int main()
{
    int money;
    cin >> money;
    int m = BagsQues(money);
    cout << m << endl;

    system("PAUSE");
    return 0;
}

 

 

求出每張面額,用了多少張:

#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>

using namespace std;

vector<int> Num{ 3,0,2,1,0,3,5 }, Value{ 1,2,5,10,20,50,100 };

vector<tuple<int, int> > BagsQues(int money) {
    int sum = 0;
    vector<tuple<int, int> > ch;
    for (int i = Value.size() - 1; i >= 0; --i) {
        int N = min(money / Value[i], Num[i]);
        money = money - N * Value[i];
        sum += N;
        if (N != 0) {
            ch.push_back({ Value[i], N });
        }
        if(money == 0)
            return ch;
    }
    ch.clear();
    ch.push_back({ -1, -1 });
    return ch;
}

int main()
{
    int money;
    cin >> money;
    vector<tuple<int, int> > m = BagsQues(money);
    for (int i = 0; i < m.size(); ++i) {
        cout << get<0>(m[i]) << ":" << get<1>(m[i]) << endl;
    }

    system("PAUSE");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM