作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴。FJ有一套硬币N种(1≤N≤20)不同的面额,每枚硬币是所有比他小的硬币面值的倍数,例如1美分硬币、5美分硬币、10美分硬币和50美分硬币。使用这些硬币,FJ每周至少给Bessie C(1 <= C <=100000000)美分。请你计算他最多能给Bessie几周
Input
* 第一行N 、 C
* 第 2..N+1行: 硬币价值 V (1 <= V <= 100,000,000) 和数量 B (1 <= B <= 1,000,000)
Output
* 使用这些硬币,每周至少给C美分的前提下的最多周数
Sample Input
3 6 10 1 1 100 5 120
Sample Output
111
题解:首先对数据按面值从大小排序,对面值大于C的直接加上其数量。然后从剩余的面值中从大到小凑金额money使其小于等于C,若money<C,则在从剩余的面值中从小到大凑金额使其大于C。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
pair<int,int> a[22];
int n,c;
int use[22];
int main(){
cin>>n>>c;
for(int i=0;i<n;++i){
cin>>a[i].first>>a[i].second;
}
sort(a,a+n);
long long sum=0;
int k=-1;
for(int i=n-1;i>=0;--i){
if(a[i].first>=c) sum+=a[i].second;
else {
k=i;break;
}
}
while(true){
int money=0;
for(int i=k;i>=0;--i){
while(a[i].second&&money+a[i].first<=c){
a[i].second--;
money+=a[i].first;
}
}
if(money>0){
for(int i=0;i<=k;i++){
while(a[i].second&&money<c){
a[i].second--;
money+=a[i].first;
}
}
}
if(money<c) break;
sum++;
}
cout<<sum<<endl;
return 0;
}