经典贪心题目~~~
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Node
{
int val, num;
Node() {}
Node(int t_val, int t_num) : val(t_val), num(t_num) {}
bool operator < (const Node &p) const
{
return val > p.val;
}
}p[30];
int use[30];
int N, C, ans, rest;
int main()
{
//freopen("aa.in", "r", stdin);
//freopen("bb.out", "w", stdout);
while(cin >> N >> C)
{
for(int i = 0; i < N; ++i)
{
cin >> p[i].val >> p[i].num;
}
sort(p, p + N);
ans = 0;
while(true)
{
rest = C;
memset(use, 0, sizeof(use));
for(int i = 0; i < N; ++i)
{
if(p[i].num > 0)
{
int t = min(p[i].num, rest / p[i].val);
rest -= t * p[i].val;
use[i] = t;
}
}
if(rest > 0)
{
for(int i = N - 1; i >= 0; --i)
{
if(p[i].num > use[i] && p[i].val >= rest)
{
use[i]++;
rest = 0;
break;
}
}
}
if(rest > 0)
break;
int t_min = INF;
for(int i = 0; i < N; ++i)
{
if(use[i])
t_min = min(t_min, p[i].num / use[i]);
}
for(int i = 0; i < N; ++i)
if(use[i])
p[i].num -= t_min * use[i];
ans += t_min;
}
cout << ans << endl;
}
return 0;
}