学Pascal的进~
邮票面值。问题描述:邮局发行一套票面有四种不同值的邮票,如果每封信所贴邮票张数不超过三枚,存在整数R,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3,…,R来,找出...
邮票面值。
问题描述:邮局发行一套票面有四种不同值的邮票,如果每封信所贴邮票张数不超过三枚,存在整数R,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3,…,R来,找出这四种面值数,使得R值最大。 展开
问题描述:邮局发行一套票面有四种不同值的邮票,如果每封信所贴邮票张数不超过三枚,存在整数R,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3,…,R来,找出这四种面值数,使得R值最大。 展开
2个回答
展开全部
问题分析:知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最大邮票。其算法是:
(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;
(2) 用这四种邮票贴出连续的整数,并且使r值最大;
(3) 用穷举法,找出所有符合条件的解;
(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:
a<b<c<d,因此a=1,用循环语句完成搜索。
Program reborn;
Var a,b,c,d:integer;
X,x0,x1,x2,x3,x4:integer;
st1:set of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
st1:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
if n1+n2+n3+n4<=3 then
begin
sum:=n1*a+n2*b+n3*c+n4*d;
st1:=st1+[sum];
end;
end;
sum:=1;
while sum in st1 do
sum:=sum+1;
number:=sum-1;
end;
begin
a:=1;x0:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
x:=number(a,b,c,d);
if x>x0 then
begin
x0:=x;x1:=a;x2:=b;x3:=c;x4:=d;
write(x1:5,x2:5,x3:5,x4:5);
writeln(‘’:10,’x0=’,x0);
end;
end;
end.
(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;
(2) 用这四种邮票贴出连续的整数,并且使r值最大;
(3) 用穷举法,找出所有符合条件的解;
(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:
a<b<c<d,因此a=1,用循环语句完成搜索。
Program reborn;
Var a,b,c,d:integer;
X,x0,x1,x2,x3,x4:integer;
st1:set of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
st1:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
if n1+n2+n3+n4<=3 then
begin
sum:=n1*a+n2*b+n3*c+n4*d;
st1:=st1+[sum];
end;
end;
sum:=1;
while sum in st1 do
sum:=sum+1;
number:=sum-1;
end;
begin
a:=1;x0:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
x:=number(a,b,c,d);
if x>x0 then
begin
x0:=x;x1:=a;x2:=b;x3:=c;x4:=d;
write(x1:5,x2:5,x3:5,x4:5);
writeln(‘’:10,’x0=’,x0);
end;
end;
end.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
program yp;
var
a,b,c,d,r,max_r,ma,mb,mc,md:integer;
function max_mz(a,b,c,d:integer):integer;
var
n1,n2,n3,n4,mz:integer;
mzj:set of 0..100;
begin
mzj:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
mz:=n1*a+n2*b+n3*c+n4*d;
mzj:=mzj+[mz];
end;
mz:=1;
while mz in mzj do mz:=mz+1;
max_mz:=mz-1;
end;
begin
a:=1;max_r:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
r:=max_mz(a,b,c,d);
if r>max_r then
begin
max_r:=r;
ma:=a;mb:=b;mc:=c;md:=d;
end;
end;
writeln(ma:4,mb:4,mc:4,md:4,max_r:8);
end.
var
a,b,c,d,r,max_r,ma,mb,mc,md:integer;
function max_mz(a,b,c,d:integer):integer;
var
n1,n2,n3,n4,mz:integer;
mzj:set of 0..100;
begin
mzj:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
mz:=n1*a+n2*b+n3*c+n4*d;
mzj:=mzj+[mz];
end;
mz:=1;
while mz in mzj do mz:=mz+1;
max_mz:=mz-1;
end;
begin
a:=1;max_r:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
r:=max_mz(a,b,c,d);
if r>max_r then
begin
max_r:=r;
ma:=a;mb:=b;mc:=c;md:=d;
end;
end;
writeln(ma:4,mb:4,mc:4,md:4,max_r:8);
end.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询