描述
作為创造產奶纪录的回报,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的零用钱。
测试样例1
输入
3 6
10 1
1 100
5 120
输出
111
备注
FJ想要每个星期给Bessie六美分。他有100个1美分硬币,120个5美分硬币,和一个10美分硬币。
FJ可以在一个星期超额付给Bessie一个10美分硬币。然后接下来的10个星期每星期付给
Bessie两个5美分硬币。最后100个星期每星期付给Bessie一个1美分硬币跟一个5美分硬
币。
贪心。不过贪心的策略的决定决定要证明它的正确性。
【代码】
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct hp{
int mon,num;
}a[50];
int j,k,n,m;
bool zz;
int cmp(hp a,hp b){
return a.mon<b.mon;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i) scanf("%d%d",&a[i].mon,&a[i].num);
sort(a+1,a+n+1,cmp);
zz=true;
j=0;
while (zz){
zz=false;
k=m;
for (int i=n;i>=1;--i)
while (a[i].num>0&&k-a[i].mon>=0){
a[i].num--;a
k-=a[i].mon;
}
for (int i=1;i<=n;++i)
if (a[i].num>0&&k>0){
a[i].num--;
k-=a[i].mon;
}
if (k<=0){
j++;
zz=true;
}
}
printf("%d",j);
}