编辑代码

#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <map>

using namespace std;

struct Money {
        int value;
        int count;

        Money(int moneyValue, int moneyCount) {
            value = moneyValue;
            count = moneyCount;
        }
};

// 打印已使用的钱
void printUsedMoney(std::map<int, int> *usedMoney) {
    for (std::map<int, int>::iterator i = usedMoney->begin(); i != usedMoney->end(); ++i)
    {
        cout << i->first << ":" << i->second << endl;
    }
    
}

// 比较两个Money结构体的大小,按照面额从大到小排序
bool compareGreaterMoney(Money left, Money right) {
    return (left.value) > (right.value);
}

// 支付指定金额的钱
void payMoney(int moneyUsedCount, std::vector<Money> *possMoney, std::map<int, int> *usedMoney) {
    //按照从大到小顺序对Money进行排序
    sort(possMoney->begin(), possMoney->end(), compareGreaterMoney);

    int curUsed = moneyUsedCount; // 待支付的钱

    for(std::vector<Money>::iterator i = possMoney->begin(); i != possMoney->end(); ++i) {
        // 支付待支付的钱需要当前面额的钱多少张
        int needCount = curUsed/i->value;

        // 当前面额的钱不能整除待支付的钱,还需要一张当前面额的钱才能支持
        if (curUsed%i->value > 0) 
        {
            ++needCount;
        }

        // 用当前面额的钱去支付
        int usedCount = 0;
        if (needCount > 0) {
            if (needCount < i->count) {
                 usedCount = needCount;
                 i->count -= needCount;

            }
            else {
                usedCount = i->count;
                i->count = 0;
            }
            // 记下当前面额的钱需要多少张
            usedMoney->insert(pair<int, int>(i->value, usedCount));
            curUsed -= (usedCount * i->value); // 减去已支付的钱
            if (0 >= curUsed)
            {
                //已经够了
                break;
            }
        }
        
    }

    if (curUsed <= 0) {
        printUsedMoney(usedMoney);
    }
    else {
        cout << "You don't have enough money. You need " << curUsed << " more."<< endl;
    }
    
}

int main(){
    
    int money = 0;
    std:vector<Money> possMoney;
    std::map<int, int> usedMoney;
    while (cin >> money && money != 0){
        
        // 初始化可选面额的钱和已使用的钱
        possMoney.push_back(Money(1, 6));
        possMoney.push_back(Money(2, 2));
        possMoney.push_back(Money(5, 10));
        possMoney.push_back(Money(10, 8));
        possMoney.push_back(Money(20, 5));
        possMoney.push_back(Money(50, 2));
        possMoney.push_back(Money(100, 3));

        // 支付指定金额的钱
        payMoney(money, &possMoney, &usedMoney);

        // 清空可选面额的钱和已使用的钱,以便下次输入新的金额
        possMoney.clear();
        usedMoney.clear();
    }
}