老问题再问:输出等于n的所有不增的正整数和式(120分)

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

studymore

Unregistered / Unconfirmed
GUEST, unregistred user!
以下程序实现
输入n,输出等于n的所有不增的正整数和式。如n=4,程序将输出:
4=4
4=3+l
4=2+2
4=2+1+1
4=l+1+1+l
题目要求用回溯实现,呵呵,我其实想看看到底什么解法比较简单,请给出注释。
btw:以前DFW有过一道这种题目,但是我没有看懂解答,呵呵,希望哪位朋友给代码时加上一点注释,谢谢!
 
代码容易注释难呀.
 
改为求解的组数会比较考算法
 
AI说的有理,求所有可行解的题目怎么使技巧也就那个样子.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MaxN = 65535;
type
TNode = record
Sum: Integer;
d: Integer;
end;

var
n: Integer;
Stack: array [1..MaxN] of TNode;
Top: Integer;
i: Integer;
begin
Write('Input n:');
ReadLn(n);
Top:=1;
Stack[Top].Sum:=0;
Stack[Top].d:=n+1;
while Top>0do
begin
while Stack[Top].d>1do
begin
Dec(Stack[Top].d);
if Stack[Top].d+Stack[Top].Sum<n then
begin
Inc(Top);
Stack[Top].Sum:=Stack[Top-1].Sum+Stack[Top-1].d;
Stack[Top].d:=Stack[Top-1].d+1
end
else
if Stack[Top].d+Stack[Top].Sum=n then
begin
Write(n, '=', Stack[1].d);
for i:=2 to Topdo
Write('+', Stack.d);
ReadLn
end
end;
Dec(Top)
end
end.
 
以前的帖子
浩思 (2002-09-28 8:06:00)
以下程序实现
输入n,输出等于n的所有不增的正整数和式。如n=4,程序将输出:
4=4
4=3+l
4=2+2
4=2+1+1
4=l+1+1+l
注意::::一定要求用回溯实现,下面的程序中,请问高手:R[k]数组何解?
const maxn=100;
var i,k,n:longint;
a,r:array[0..maxn] of longint;
begin
write('Input n:');
readln(n);
a[1]:=n;
r[1]:=0;
k:=1;
repeat
if r[k]=0
then
begin
for i:=1 to kdo
write(a,' ');
writeln;
while (k>0) and (a[k]=1)do
k:=k-1;
a[k]:=a[k]-1;
r[k]:=r[k]+1
end
else
begin
if r[k]<a[k]
then
a[k+1]:=r[k]
else
a[k+1]:=a[k];
r[k+1]:=r[k]-a[k+1];
k:=k+1
end
until k=0
end.


yzbzf (2002-07-17 13:14:00)
这段程序是这个意思:因为你进行整数分解时时按不增序分解的,
那么我首先要保证探测值(r[k])小于或等于当前分解值(a[k]),
当满足这个条件时表示该探测值是可取的,所以取r[k]作为下一个分解值。
k表示的是当前探测的深度,也就是分解后形成的正整数的个数。
r[k]=0就表示当前的这次探测结束,输出结果,同时将深度减1,实现回朔.[:)]

呵呵,不过我也没有看懂~!
 
to LeeChange:
谢谢您的代码,呵呵,我仔细看看。
to snowrain:
我就是看不懂这个代码才问的。
 
試了寫了一下,不知可以不。
a為和式、r為余式。
程序很難說得很明白,可以單步走走看數組a與r的變化就清楚了
const maxn=100;
var i,k,n:longint;
a,r:array[0..maxn] of longint;
begin
write('Input n:');
readln(n);
a[1]:=n;
r[1]:=0;
k:=1;
repeat
if r[k]=0 //余為零,a是一組解
then
begin
for i:=1 to kdo
write(a,' ');
writeln;
while (k>0) and (a[k]=1)do

k:=k-1;
//a[k]等於1,表示這一組和式的最遠值已im 沒法分,分解其a[k-1](當所有的a都為零後,就可以一再把k 減到0,程序終止
a[k]:=a[k]-1;
//輸完一組以後,對最遠值再減一進行下論探查
r[k]:=r[k]+1
end
else
begin
if r[k]<a[k]
then
a[k+1]:=r[k]//假如r[k] <a[k],直接把r[k]這個值
作為a[k+1](因為可以滿足條件),結合下面語句我們可以發現,程序進入過這裡以後,
下一輪循環肯定是一組解
else
a[k+1]:=a[k];
r[k+1]:=r[k]-a[k+1];
k:=k+1
end
until k=0 // 見上面那個while循環
end.

 
后退
顶部