poj 2248 Addition Chains[迭代加深]
By admin 浏览(56)
题意:
加法链的 定义是第一个元素是1,最后一个是n,所有元素从小到大排列,并且除了1之外任意一个元素都是前面两个元素的和(那两个元素可相同),给定n,求元素最少的加法链.
思路:
做这个题,特意学了下迭代加深搜索,模型是:
for(deep=1; 1; deep++)
{
dfs(0);
If(find = true)
break;
}
它需要重复地从上往下搜,第一次搜到的就是问题的解,解空间比bfs小得多, 也不用像dfs那样需要搜所有的解。
01 | #include <stdio.h> | |
02 | #define N 100 |
03 | int num[N]; |
04 | int ans[N]; |
05 | int deep; | |
06 | int cnt; |
07 | int find; | |
08 | int n; |
09 |
| |
10 | void dfs(int k) |
11 | { | |
12 | int i, j; |
13 | if(!find) | |
14 | { |
15 | if(num[k] == n) | |
16 | { |
17 | for(i=0; i<=k; i++) | |
18 | ans[i] = num[i]; |
19 | cnt = k; | |
20 | find = 1; |
21 | return; | |
22 | } |
23 | else if(k < deep && !find) | |
24 | { |
25 | for(i=k; i>=0; i--) | |
26 | { |
27 | if(num[i] * 2 > num[k]) |
28 | for(j=i; j>=0; j--) |
29 | { | |
30 | if(num[i] + num[j] > num[k] && num[i] + num[j] <=n) |
31 | { | |
32 | num[k+1] = num[i]+num[j]; |
33 | dfs(k+1); | |
34 | } |
35 | } | |
36 | } |
37 | } | |
38 | } |
39 | } |
40 |
|
41 | int main() | |
42 | { |
43 | int i; | |
44 | while(scanf("%d", &n), n) |
45 | { | |
46 | find = 0; |
47 | deep = 2; | |
48 | num[0] = 1; |
49 | for(deep = 1; 1; deep++) | |
50 | { |
51 | dfs(0); | |
52 | if(find) |
53 | break; | |
54 | } |
55 | for(i=0; i<cnt; i++) | |
56 | printf("%d ", ans[i]); |
57 | printf("%d/n", ans[i]); | |
58 | } |
59 | return 0; | |
60 | } |