pascal 高手进

球迷购票(work3.pas)[问题描述]盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。按售票处规定,每位购票者限购一张门票,且每张票售价为50元。在排成长... 球迷购票(work3.pas)
[问题描述]
盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。
按售票处规定,每位购票者限购一张门票,且每张票售价为50元。在排成长龙的球迷中有m个人手持面值50元的钱币,另有n个人手持面值100元的钱币。假设售票处在开始售票时没有零钱。试问这m+n个球迷有多少种排队方式可使售票处不致出现找不出钱的尴尬局面。
例如当m=3,n=2时,用A表示手持面值50元钱币的球迷,用B表示手持面值100元钱币的球迷,则最多可得到以下5组不同排队方式,使售票处不致出现找不出钱的尴尬局面。
售票处 A A A B B
售票处 A A B A B
售票处 A B A A B
售票处 A A B B A
售票处 A B A B A

[编程任务]
对于给定的m和n的值( 0  m,n  100),编程计算出m+n个球迷有多少种排队方式可使售票处不致出现找不出钱的尴尬局面。

[数据输入]
输入文件(work3.in)只有一行两个数,分别表示m和n的值,用一个空格隔开。

[数据输出]
输出文件(work3.out)只有一个数。

[输入示例]
3 2

[输出示例]
5

作业4、分油问题(work4.pas)
[问题描述]
设有大小不等的3个无刻度的油桶,分别能够存满,X,Y,Z公升油(例如X=80,Y=50,Z=30)。初始时,第一个油桶盛满油,第二、三个油桶为空。编程寻找一种最少步骤的分油方式,在某一个油桶上分出targ升油(例如targ=40)。若找到解,则将分油方法打印出来;否则打印信息“UNABLE”等字样,表示问题无解。

输入输出:
输入文件(work4.in)一行4个整数,依次表示X,Y,Z,targ,每个数之间用一个空格隔开;
输出文件(work4.out)表示解的情况,如果无解输出UNABLE,如果有解,则输出分油方法(每一步三个油桶的状态),如果解不唯一也只有输出任一个解,如:
输入:80 50 30 40
则输出:
80 0 0
50 0 30
50 30 0
20 30 30
20 50 10
70 0 10
70 10 0
40 10 30
请把第一题的源程序给出来
展开
 我来答
米毅画啊职8507
2006-03-29 · TA获得超过104个赞
知道答主
回答量:183
采纳率:0%
帮助的人:0
展开全部
program l_3(input,output);
var
m,n:integer;
function stack(m,n,k:integer):qword;
begin
if m=0 then
if k=0 then
stack:=0
else
if k<n then stack:=0 else stack:=1
else
if k=0 then
if n=0 then
stack:=1
else
stack:=stack(m-1,n,k+1)
else
if n=0 then
stack:=1
else
stack:=stack(m-1,n,k+1)+stack(m,n-1,k-1);
end;
begin
assign(input,'work3.in');
reset(input);
assign(output,'work3.out');
rewrite(output);
readln(m,n);
if m<n then
writeln('0')
else
writeln(stack(m,n,0));
close(input);
close(output);
end.

program l_4(input,output);
type
node=record
cx,cy,cz:integer;
end;
var
q:array[1..10000] of node;
f,r:integer;
wx,wy,wz,targ,x,y,z:integer;
flag:boolean;
procedure out;
begin
wx:=q[f].cx;
wy:=q[f].cy;
wz:=q[f].cz;
end;
procedure push;
var
k:integer;
flag1:boolean;
begin
flag1:=true;
for k:=1 to r do
if (q[k].cz=wz) and (q[k].cy=wy) and (q[k].cx=wx) then flag1:=false;
if flag1 then
begin
r:=r+1;
q[r].cz:=wz;
q[r].cy:=wy;
q[r].cz:=wz;
end;
end;
procedure cup;
begin
out;
if wz>0 then
begin
if wz+wy>=y then
begin
wz:=wz+wy-y;
wy:=y;
end
else
begin
wy:=wz+wy;
wz:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wz>0 then
begin
if wz+wx>=x then
begin
wz:=wz+wy-x;
wx:=x;
end
else
begin
wx:=wz+wx;
wz:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cz=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wy>0 then
begin
wz:=wz+wy;
wy:=0;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wy>0 then
begin
if wy+wx>=x then
begin
wy:=wy+wx-x;
wx:=x;
end
else
begin
wx:=wx+wy;
wy:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wx>0 then
begin
wz:=wz+wx;
wx:=0;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wx>0 then
begin
if wx+wy>=y then
begin
wx:=wx+wy-y;
wx:=0;
end
else
begin
wy:=wy+wx;
wx:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
end;
procedure print;
var
i:integer;
begin
for i:=1 to r do
writeln(q[i].cz:8,q[i].cy:8,q[i].cx:8);
end;
begin
f:=1;
r:=1;
assign(input,'work4.in');
reset(input);
assign(output,'work4.out');
rewrite(output);
readln(x,y,z,targ);
q[1].cz:=z;
q[1].cy:=0;
q[1].cx:=0;
flag:=false;
repeat
cup;
f:=f+1;
until flag or (f>r);
if f>r then
write('UNABLE')
else
print;
close(input);
close(output);
end.
浸惬口家殿律9605
2006-03-18
知道答主
回答量:37
采纳率:0%
帮助的人:0
展开全部
第一道,输出C(n,n+m)-C(n-1,n+m),注意精度问题
第二道是广搜,可以用三维状态〔i,j,k]表示i,j,k公升有出现过没有判重
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2006-03-26
展开全部
可以看看黑书上面有讲解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e17857b
2006-03-18
知道答主
回答量:17
采纳率:0%
帮助的人:0
展开全部
回朔
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式