假如老板要找给我99分钱,他有上面的面值分别为25,10,5,1的硬币数,为了找给我最少的硬币数,那么他是不是该这样找呢,先看看该找多少个25分的,诶99/25=3,好像是3个,要是4个的话,我们还得再给老板一个1分的,我不干,那么老板只能给我3个25分的拉,由于还少给我24,所以还得给我2个10分的和4个1分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; const int MAXN=1e3+10; struct node { int val; // 币值 int num; // 数量 friend bool operator < (node a,node b){ return a.val>b.val; } }a[MAXN]; int main() { int n,m,res,i; // n为种类数,m为总钱数 cin>>n>>m; for(i=1;i<=n;i++) cin>>a[i].val>>a[i].num; sort(a+1,a+1+n); res=0; for(i=1;i<=n;i++){ if(a[i].val<=m){ int x=m/a[i].val; if(x>=a[i].num){ m-=a[i].num*a[i].val; res+=a[i].num; } else{ m-=x*a[i].val; res+=x; } } } if(m>0)cout << "no" <<endl; else cout <<res << endl; } |