pascal 切蛋糕

来源:百度知道 编辑:UC知道 时间:2024/05/13 06:16:55
描述 Description
Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴。他答应给每个人留一口,然后量了量每个人口的大小。Facer有把刀,可以切蛋糕,但他不能把两块蛋糕拼起来,但是他又不会给任何人两块蛋糕。现在问你,facer怎样切蛋糕,才能满足最多的人。(facer的刀很强,切的时候不会浪费蛋糕)。
输入格式 Input Format
第一行n,facer有n个蛋糕。接下来n行,每行表示一个蛋糕的大小。再一行一个数m,为信息组的人数,然后m行,每行一个数,为一个人嘴的大小。(1<=n<=50, 1<=m<=1024)

输出格式 Output Format
一行,facer最多可以填多少张嘴巴。

var n,m,i,min,mid,max,start,last,r,tot,j:longint;
b,sum:array[0..1025]of longint;
a:array[0..51]of longint;
ok:boolean;
ch:char;
procedure sort(x,y:longint); //快排
var i,j,k:longint;
begin
i:=x;j:=y;k:=b[(x+y)shr 1];
while i<j do begin
while b[i]<k do inc(i);
while b[j]>k do dec(j);
if i<=j then begin
b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
inc(i);dec(j);
end;
end;
if i<y then sort(i,y);
if j>x then sort(x,j);
end;

procedure dfs(dep,l:longint);//深搜
var i:longint;
begin
if dep=0 then begin
ok:=true;
exit;
end;
if r+sum[mid]>tot then exit;
for i:=l to n do//从小的开始吃
if a[i]>=b[dep] then begin
dec(a[i],b[dep]);
if a[i]<b[1] then inc(r,a[i]);
if b[dep]=b[