问一个与前面studymore朋友问的类似的拆数问题(70分)

  • 主题发起人 主题发起人 snowrain
  • 开始时间 开始时间
S

snowrain

Unregistered / Unconfirmed
GUEST, unregistred user!
给定两个正整数m,n(m>=n!),将m拆成n个数相加:m=a(1)+a(2)+...+a(n),各数不重复,不分先后,编程列出所有的拆法.
例如:若m=7,n=3则只有一种拆法:
7=1+2+4
这个问题与前面Leechange朋友解studymore那个问题类似,呵呵,看了Leechange朋友的代码,好像可以改一下就适应这道题了,但是又改不来,还是要请教一下!
 
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MaxN = 65535;
type
TNode = record
Sum: Integer;
d: Integer;
end;

var
m, n: Integer;
Stack: array [1..MaxN] of TNode;
Top: Integer;
i: Integer;
begin
Write('Input m: ');
ReadLn(m);
Write('Input n: ');
ReadLn(n);
Top:=1;
Stack[Top].Sum:=0;
Stack[Top].d:=0;
while Top>0do
begin
while Stack[Top].d<mdo
begin
Inc(Stack[Top].d);
if (Stack[Top].d+Stack[Top].Sum<m) and (Top<n) then
begin
Inc(Top);
Stack[Top].Sum:=Stack[Top-1].Sum+Stack[Top-1].d;
Stack[Top].d:=Stack[Top-1].d
end
else
if (Stack[Top].d+Stack[Top].Sum=m) and (Top=n) then
begin
Write(m, '=', Stack[1].d);
for i:=2 to Topdo
Write('+', Stack.d);
ReadLn
end
end;
Dec(Top)
end
end.
 
呵呵,这到题如果求解的种数,就是信息学的一道初赛题目了
 
对不起,这两周有点事情,没有来看这个问题。
leechange老师,能否将您这个程序,改成递归实现?我本来想自己来的,可惜搞不出来。
谢谢!
 
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MaxN = 65535;
var
m, n: Integer;
List: array [0..MaxN] of Integer;
procedure Print(LastValue: Integer);
var
i: Integer;
begin
Write(m, '=');
for i:=1 to n-1do
Write(List, '+');
WriteLn(LastValue)
end;

proceduredo
It(Sum, Dep: Integer);
var
i: Integer;
begin
if Dep<=n then
for i:=List[Dep-1]+1 to m-Sumdo
if (Sum+i=m) and (Dep=n) then
Print(i)
else
begin
List[Dep]:=i;
do
It(Sum+i, Dep+1)
end
end;

begin
Write('Input m and n: ');
ReadLn(m, n);
FillChar(List, SizeOf(List), 0);
do
It(0, 1);
ReadLn
end.
 
to Leechange老师:
问个很初级的问题,您这个递归程序是BFS广度优先搜索还是DFS深度优先搜索?我觉得
像BFS,但不确定,请教一下!
 
to Leechange老师:
for i:=List[Dep-1]+1 to m-Sumdo
..
第一次递归时,sum=0,第一层装入所有1~m的元素。然后对每个节点产生下一层节点,这应该是BFS哦,为什么是DFS?能给我解释一下吗?谢谢!

 
for i:=List[Dep-1]+1 to m-Sumdo
if (Sum+i=m) and (Dep=n) then
Print(i)
else
begin
List[Dep]:=i;
do
It(Sum+i, Dep+1)
end
怎么能说:"第一层装入所有1~m的元素"呢.
明明是只装入了1就去调用DoIt(1, 2)了嘛.
 
后退
顶部