pascal编程:数字游戏

有这么一个游戏:写出一个1~N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个... 有这么一个游戏:写出一个1~N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置。下面是一个例子:
3 1 2 4
4 3 6
7 9
16
最后得到16这样一个数字。
现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1~N的一个排列。若答案有多种可能,则输出字典序最小的那一个。
输入格式:1行,为两个正整数n,sum。输出格式:1行,为字典序最小的那个答案。
输入:4 16 输出:3 1 2 4
数据规模:对于40%的数据,n≤7;对于80%的数据,n≤10;对于100%的数据,n≤12,sum≤12345,且保证一定有解。
展开
 我来答
gcbjoy
2016-08-14 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:92%
帮助的人:2325万
展开全部
不一定是最优,仅提供一种思路 !

var
a:array[1..15,1..15] of integer;
p,d,d0:array[1..15] of integer;
b:array[1..15] of boolean;
i,j,n:integer;
sum:integer;
find:boolean;

function s:integer;
var
i,j:integer;
begin
for j:=1 to n do a[1,j]:=d[j];
for i:=2 to n do 
for j:=1 to n-i+1 do 
a[i,j]:=a[i-1,j]+a[i-1,j+1];
s:=a[n,1];
end;

procedure pailie(x:integer);
var
m:integer;
begin
if x>n then begin
if s=sum then begin 
for m:=1 to n do write(d[m]:3); 
writeln;
find:=true; 
end;
end else for m:=1 to n do 
if (not b[m])and(not find) then begin 
d0:=d; 
d[x]:=p[m]; 
b[m]:=true; 
pailie(x+1); 
b[m]:=false; 
d:=d0; 
end; 
end;

begin
n:=12;
sum:=13312;
find:=false;
for i:=1 to n do begin p[i]:=i; b[i]:=false; end;
pailie(1);
end.
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式