码迷,mamicode.com
首页 > 编程语言 > 详细

搜索与回溯算法

时间:2015-10-05 19:25:55      阅读:336      评论:0      收藏:0      [点我收藏+]

标签:

【例】任何一个大于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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!