生活随笔
收集整理的这篇文章主要介绍了
July面试整理系列--(5)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.
1 #include <iostream>
2 #include <vector>
3 #include <stack>
4
5 using namespace std;
6
7 /*
8 思路:
9 h(n,m)表示从1到n中 任意取几个数和为m的方法数。
10 则有 h(n,m)= h(n-1,m-n) 或者 h(n-1,m) (既n取或者不取)
11 当然其中 注意到 当 m < n 时 可以 直接跳到 h(m,m).还要注意边界条件,既当满足什么条件是
12 可以直接得出结果。
13
14 递归深搜
15 */
16 stack<
int>
ans;
17 void fun(
int n,
int m)
18 {
19 if(n >=
0 && m ==
0)
20 {
21 stack<
int> ans_tmp =
ans;
22 while(!
ans_tmp.empty())
23 {
24 cout<<ans_tmp.top()<<
" ";
25 ans_tmp.pop();
26 }
27 cout<<
endl;
28 return;
29 }
30 if(n ==
1 && m ==
1)
31 {
32 ans.push(
1);
33 stack<
int> ans_tmp =
ans;
34 while(!
ans_tmp.empty())
35 {
36 cout<<ans_tmp.top()<<
" ";
37 ans_tmp.pop();
38 }
39 cout<<
endl;
40 ans.pop();
41 return;
42 }
43 if(n ==
1 && m >
1)
44 {
45 return;
46 }
47 if(n <=
m)
48 {
49 ans.push(n);
50 fun(n-
1,m-
n);
51 ans.pop();
52
53 fun(n-
1,m);
54 }
55 else
56 {
57 fun(m,m);
58 }
59 return;
60 }
61
62 int main()
63 {
64 fun(
10,
7);
65 return 0;
66 }
转载于:https://www.cnblogs.com/cane/p/3850825.html
总结
以上是生活随笔为你收集整理的July面试整理系列--(5)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。