本题有四个坑
1.投币余额没有10块的限制
2.E009,E010后面没有换行符
3.查询功能需要考虑到格式,如果存在空格导致格式不对,当error处理
4.练习调试信息有错误,根据练习调试看不出个所以然。
难点主要是退币算法,其余挨个实现就行

#include<iostream>
#include<unordered_map>
#include<map>
#include<vector>
#include<utility>
#include<algorithm>
#include<sstream>
using namespace std;
int number=0,num,balance;
char hyphen,colon;
unordered_map<string,int>  goods={{"A1",0},{"A2",0},{"A3",0},{"A4",0},{"A5",0},{"A6",0}};
map<int,int>               money={{1,0},{2,0},{5,0},{10,0}};
unordered_map<string,int>  mp={{"A1",2},{"A2",3},{"A3",4},{"A4",5},{"A5",8},{"A6",6}};
bool rule(const pair<string,int> p1,const pair<string,int> p2){
    if(p1.second>p2.second)      return true;
    else if(p1.second<p2.second) return false;
    else{
        return p1.first<p2.first;
    }
}
vector<string> split(string str,char c){
    vector<string> vec;
    int idx;
    str+="#";
    while(str.size()!=1){
        idx=str.find(c);
        vec.emplace_back(str.substr(0,idx));
        str=str.substr(idx+1);
    }
    return vec;
}
void initialization(string str){
    stringstream ss(str);
    //Goods Initialization 
    number=0;
    ss>>hyphen;
    ss>>num>>hyphen;  goods["A1"]=num;  number+=num;
    ss>>num>>hyphen;  goods["A2"]=num;  number+=num;
    ss>>num>>hyphen;  goods["A3"]=num;  number+=num;
    ss>>num>>hyphen;  goods["A4"]=num;  number+=num;
    ss>>num>>hyphen;  goods["A5"]=num;  number+=num;
    ss>>num;          goods["A6"]=num;  number+=num;
    //Money Initialization
    ss>>num>>hyphen;  money[1]=num;
    ss>>num>>hyphen;  money[2]=num;
    ss>>num>>hyphen;  money[5]=num;
    ss>>num;          money[10]=num;
    cout<<"S001:Initialization is successful"<<endl;
}
void pay(string str){
    num=stoi(str.substr(2));
    if(money.find(num)==money.end())           cout<<"E002:Denomination error"<<endl;
    else if(num>2&&money[1]*1+money[2]*2<num)  cout<<"E003:Change is not enough, pay fail"<<endl;
    else if(num>10)                            cout<<"E004:Pay the balance is beyond the scope biggest"<<endl;
    else if(number==0)                         cout<<"E005:All the goods sold out"<<endl;
    else{
        balance+=num;
        money[num]++;
        cout<<"S002:Pay success,balance="<<balance<<endl;
    }
}
void buy(string str){
    string good_name=str.substr(2);
    if(goods.find(good_name)==goods.end())    cout<<"E006:Goods does not exist"<<endl;
    else if(goods[good_name]==0)              cout<<"E007:The goods sold out"<<endl;
    else if(mp[good_name]>balance)            cout<<"E008:Lack of balance"<<endl;
    else{
        balance-=mp[good_name];
        goods[good_name]--;
        number--;
        cout<<"S003:Buy success,balance="<<balance<<endl;
    }
}
void refund(){
    if(balance==0) cout<<"E009:Work failure";
    //The rule of refound.
    else{
        int y1=0,y2=0,y5=0,y10=0;
        int origin=balance;
        if(balance>=10&&money[10]>0) {
            if(balance<=10*money[10]){
                y10=balance/10;
                money[10]-=y10;
                balance-=(10*y10);
            }else{
                y10=money[10];
                money[10]=0;
                balance-=(10*y10);
            }
        }
        if(balance>=5&&money[5]>0){
            if(balance<=5*money[5]){
                y5=balance/5;
                money[5]-=y5;
                balance-=(5*y5);
            }else{
                y5=money[5];
                money[5]=0;
                balance-=(5*y5);
            }
        }
        if(balance>=2&&money[2]>0){
            if(balance<=2*money[2]){
                y2=balance/2;
                money[2]-=y2;
                balance-=(2*y2);
            }else{
                y2=money[2];
                money[2]=0;
                balance-=(2*y2);
            }
        }
        if(balance>=1&&money[1]>0){
            if(balance<=money[1]){
                y1=balance;
                money[1]-=y1;
                balance-=y1;
            }else{
                y1=money[1];
                money[1]=0;
                balance-=y1;
            }
        }
        //If lack of change, try the best to refund more
        if(balance!=0&&y5>0&&((money[2]+y2)*2>=origin-10*y10)){
            balance+=(5*y5+2*y2+y1);
            money[5]+=y5; y5=0;
            money[2]+=y2; y2=0;
            money[1]+=y1; y1=0;
            y2=balance/2;
            money[2]-=y2;
            balance-=(2*y2);
        }
        cout<<"1 yuan coin number="<<y1<<endl;
        cout<<"2 yuan coin number="<<y2<<endl;
        cout<<"5 yuan coin number="<<y5<<endl;
        cout<<"10 yuan coin number="<<y10<<endl;
    }
}
void querry(string str){
            if(str=="0"){
                vector<pair<string,int>> dic;
                pair<string,int> p1("A1",goods["A1"]);
                dic.emplace_back(p1);
                pair<string,int> p2("A2",goods["A2"]);
                dic.emplace_back(p2);
                pair<string,int> p3("A3",goods["A3"]);
                dic.emplace_back(p3);
                pair<string,int> p4("A4",goods["A4"]);
                dic.emplace_back(p4);
                pair<string,int> p5("A5",goods["A5"]);
                dic.emplace_back(p5);
                pair<string,int> p6("A6",goods["A6"]);
                dic.emplace_back(p6);
                sort(dic.begin(),dic.end(),rule);
               for(int i=0;i<6;i++)
                   cout<<dic[i].first<<" "<<mp[dic[i].first]<<" "<<dic[i].second<<endl;
            }
            else if(str=="1"){
                for(auto m=money.begin();m!=money.end();m++)
                    cout<<m->first<<" yuan coin number="<<m->second<<endl;
            }
            else cout<<"E010:Parameter error";
}
int main(){
    string str;
    while(getline(cin,str)){
        number=0;
        balance=0;
        vector<string> vec_str=split(str,';');
        for(auto v:vec_str){
            if(v[0]=='r')       initialization(v);
            else if(v[0]=='p')  pay(v);
            else if(v[0]=='b')  buy(v);
            else if(v[0]=='c')  refund();
            else if(v[0]=='q')  querry(v.substr(2));
        }
    }
    return 0;
}