题目:给定两个数n 和 m,要求在1~n中输出所有和为m的组合。
思路:利用栈进行递归和回溯就OK了。
代码如下:
1 void FindSum(int n, int m) 2 { 3 // 定义一个共享的栈 4 static int Stack[MAX]; 5 static int nTop = -1; 6 7 if ((n <= 0) || (m <= 0)) 8 { 9 return; 10 } 11 12 if (m > n) 13 { 14 Stack[++nTop] = n; 15 FindSum (n - 1, m - n); 16 --nTop; 17 FindSum (n - 1, m); 18 } 19 else 20 { 21 Stack[++nTop] = m; 22 for (int i = 0; i <= nTop; ++i) 23 { 24 printf ("%d ", Stack[i]); 25 } 26 27 printf ("\n"); 28 29 --nTop; 30 31 FindSum (m - 1, m); 32 } 33 }
一些测试结果: