不是VIP会员,不能显示答案

题目解答

题目:
买糖果
【问题描述】
要过春节了,多多家里总要准备点糖果招待亲朋好友。现在市场上有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.
考点:
分析:
解答:
评论:
老师: