pascal高手请进!请进!请进!!!!!!!!!!

2025-03-06 03:55:49
推荐回答(3个)
回答1:

用dfs就行

dfs是深搜,一种算法,跟语言没关系

我学的就是pascal,其实除了竞赛,pascal没什么


看你的水平,应该刚学完语言,数据结构都没学
你的水平太菜了,放弃这道题目吧

回答2:

首先枚举深度。从N到N DIV M+1.
每个深度再从小到大枚举数,让它们和是N就好。
叫IDA* 算法。确实不容易。

回答3:

var
f:array[-10..10000]of
longint;
g:array[-1..101]of
longint;
a:array[0..10000]of
boolean;
lo:array[1..101]of
longint;
tep,ya,ans,s,t,n,i,j,max,min:longint;
l:longint;
procedure
sort;
begin
for
i:=1
to
n-1
do
for
j:=i+1
to
n
do
if
g[i]>g[j]
then
begin
min:=g[i];
g[i]:=g[j];
g[j]:=min;
end;
end;
procedure
init
;
begin
readln(l);
readln(s,t,n);
ans:=0;
if
s=t
then
begin
for
i:=1
to
n
do
begin
read(tep);
if
tep
mod
s
=0
then
inc(ans);
end;
write(ans);
halt;
end;
g[0]:=0;
ya:=s*(s+1);
for
i:=1
to
n
do
read(g[i]);
sort;
g[n+1]:=l;
for
i:=1
to
n+1
do
begin
lo[i]:=g[i]-g[i-1];
if
lo[i]>ya
then
lo[i]:=ya;
end;
for
i:=1
to
n+1
do
g[i]:=g[i-1]+lo[i];
fillchar(f,sizeof(f),false);
for
i:=1
to
n
do
a[g[i]]:=true;
for
i:=1
to
10000
do
f[i]:=150;
for
i:=-10
to
-1
do
f[i]:=150;
f[0]:=0;
end;
begin
init;
for
i:=s
to
g[n+1]+t-1
do
begin
min:=101;
for
j:=s
to
t
do
if
f[i-j]then
min:=f[i-j];
if
a[i]
then
f[i]:=min+1
else
f[i]:=min;
end;
min:=101;
for
i:=g[n+1]
to
g[n+1]+t-1
do
if
f[i]then
min:=f[i];
if
min>n
then
min:=n;
write(min);
end.