生活随笔
收集整理的這篇文章主要介紹了
July面试整理系列--(5)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
編程求解:
輸入兩個(gè)整數(shù) n 和 m,從數(shù)列1,2,3.......n 中 隨意取幾個(gè)數(shù),
使其和等于 m ,要求將其中所有的可能組合列出來.
1 #include <iostream>
2 #include <vector>
3 #include <stack>
4
5 using namespace std;
6
7 /*
8 思路:
9 h(n,m)表示從1到n中 任意取幾個(gè)數(shù)和為m的方法數(shù)。
10 則有 h(n,m)= h(n-1,m-n) 或者 h(n-1,m) (既n取或者不取)
11 當(dāng)然其中 注意到 當(dāng) m < n 時(shí) 可以 直接跳到 h(m,m).還要注意邊界條件,既當(dāng)滿足什么條件是
12 可以直接得出結(jié)果。
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 }
轉(zhuǎn)載于:https://www.cnblogs.com/cane/p/3850825.html
總結(jié)
以上是生活随笔為你收集整理的July面试整理系列--(5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。