买糖果
【问题描述】
要过春节了,多多家里总要准备点糖果招待亲朋好友。现在市场上有N种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是P_i,现在有C—_i个朋友想吃这种糖果。
现在多多有B元钱去买糖果。他最多可以给多少个朋友买到糖果?所有的朋友都只吃他们喜欢类型的一颗糖果。
例如:现在有50块钱,有5种不同类型的糖果:
糖果类型 每颗糖果价格 想吃该类型糖果的朋友数量
1 5 3
2 1 1
3 10 4
4 7 2
5 60 1
显然,多多不能购买第5种类型的糖果,因为他钱不够。
下面的购买方案是最优的:
买1颗类型2的糖果,买3颗类型1的糖果,买2颗类型4的糖果,买2颗类型3的糖果。总共花费1+3*5+2*7+2*10=50,这样,多多最多满足1+3+2+2=8个朋友的糖果需求。
【输入格式】
第一行:两个用空格隔开的整数N和B
第2..N+1行:每行两个整数:P_i和C_i
【输出格式】
一行:一个整数,表示最多可以让多少朋友吃到糖果
【输入样例】
5 50
5 3
1 1
10 4
7 2
60 1
【输出样例】
8
【程序清单】
PROGRAM CX2016P5;
var n,i,j,k,t,s:integer;
a,b:array[0..100] of integer;
Procedure sort; //插入排序
var j,i,x,y:longint;
Begin
a[0]:=-maxint;
for i:=2 to n do
begin
x:=a[i];
y:=b[i];
_____j:=i-1______ ;
While x<a[j] Do
Begin
a[j+1]:=a[j];
b[j+1]:=b[j];
j:=j-1;
End;
_____a[j+1]:=x______ ;
_____b[j+1]:=y______ ;
End;
End;
begin
read(n,s);
for i:=1 to n do
read(a[i],b[i]);
sort;
for i:=1 to n do
begin
if s>=a[i]*b[i] then
begin
k:=k+b[i];
s:=s-a[i]*b[i];
end
else
begin
_____k:=k+s div a[i]______ ;
break;
end;
end;
_____writeln(k);
______ ;
end.