計蒜客 零花錢

作為創造產奶紀錄的回報,Farmer  John決定開始每個星期給Bessie一點零花錢。 FJ有一些硬幣,一共有N  (1  < =  N  < =  20)種不同的面額。每一個面額都能整除所有比它大的面額。 他想用給定的硬幣的集合,每個星期至少給Bessie某個零花錢的數目C  (1  < =  C  < =  100000000)。請幫他計算他最多能支付多少個星期的零花錢。

輸入格式:

*  第一行:  兩個由空格隔開的整數:  N  和  C *  第2到第N+1行:  每一行有兩個整數表示一個面額的硬幣:硬幣面額V  (1<=V<=100,000,000)和Farmer  John擁有的該面額的硬幣數B  (1<=B<= 1,000,000).

輸出格式:

*  第一行:  一個單獨的整數,表示Farmer  John最多能給Bessie支付多少個星期至少為C的零用錢。

FJ想要每個星期給Bessie六美分。他有100個1美分硬幣,120個5美分硬幣,和一個10美分硬幣。 FJ可以在一個星期超額付給Bessie一個10美分硬幣。然後接下來的10個星期每星期付給 Bessie兩個5美分硬幣。最後100個星期每星期付給Bessie一個1美分硬幣跟一個5美分硬 幣。

樣例輸入

3 6
10 1
1 100
5 120

樣例輸出

111
題解:面額從大往小排。只要比C小就用面額小的一點點加。直到超過或相等,則ans++


#include<bits/stdc++.h>
using namespace std;

struct node{
    long num;
    long many;
}a[21];

bool cmp(node a,node b){
    return a.num>b.num;
}

int main()
{
    long c;
    long n,ans=0;
    cin>>n>>c;
    for(int i=0; i<n; i++)
    {
        cin>>a[i].num>>a[i].many;
    }
    sort(a,a+n,cmp);//將面額大的排前面
    while(1){
        int f=c;
        for(int i=0; i<n; i++)//找出第一個比C小的數
            while(a[i].many&&f-a[i].num>0)
                a[i].many--,f-=a[i].num;
        for(int i=n-1; i>=0; i--)//用小的數一點一點加上前面找出的數直到比C大或等
            while(a[i].many&&f>0)
                a[i].many--,f-=a[i].num;
        if(f<=0)
            ans++;
        else
            break;
    }
    cout<<ans;
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章