标签:
【例】任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14
1 【参考程序】 2 program ex5_3; 3 var a:array[0..100]of integer; 4 n,t,total:integer; 5 procedure print(t:integer); 6 var i:integer; 7 begin 8 write(n,‘=‘); 9 for i:=1 to t-1 do write(a[i],‘+‘); 10 //输出一种拆分方案 11 writeln(a[t]); 12 total:=total+1; 13 //方案数累加1 14 end; 15 procedure Search(s,t:integer); 16 var i:integer; 17 begin 18 for i:=1 to s do 19 if (a[t-1]<=i)and(i<n) then 20 //当前数i要大于等于前1位数, 21 且不过n 22 begin 23 a[t]:=i; 24 //保存当前拆分的数i 25 s:=s-a[t]; 26 //s减去数i, s的值将继续拆分 27 if s=0 then print(t) 28 //当s=0时,拆分结束输出结果 29 else Search(s,t+1); 30 //当s>0时,继续递归 31 s:=s+a[t]; 32 //回溯:加上拆分的数, 33 以便产分所有可能的拆分 34 end; 35 end; 36 BEGIN 37 readln(n); 38 Search(n,1); 39 //将要拆分的数n传递给s 40 writeln(‘total=‘,total); 41 //输出拆分的方案数 42 readln; 43 END.
标签:
原文地址:http://www.cnblogs.com/vacation/p/4856083.html