週末的時候,師兄提了乙個小學生的題目,然後這個題目自我估計,反正我是做不出來的。然後師兄想用計算機的方法,寫個**看能不能把這個問題解答出來,於是就找了一下我這個菜雞一起討論(題目就不貼了,樓主感覺小學生過的好難啊),最後師兄表示他在乙個問題上卡住了,簡化之後問題是這樣的:有n個數,他們之和為m,這些組合有多少種可能性,並將這些可能性列出來。用迴圈的話,這個鬼知道要套多少層迴圈,解決方案就是用遞迴(ps:遞迴真的是乙個好東西,可是辣雞樓主遞迴用得並不好)。參考了大佬的乙個部落格,修改了一下**,得到了這個解決方案(遞迴這種東西,是真的要好好學呀!)。
照例,放上參考的大佬部落格:
接下來是菜鳥自己寫的對於這個問題的解決方案:
#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
vectorrecord;
vector> result;
void print()
/*n是個數,m是總數,本函式的目的是得到n個數相加和為m的所有情況
考慮下來,可以採用遞迴的思想
*/void func(int n, int m)
return;
}for (int beg = 1; beg <= m -2 ; ++beg)
}int main()
採用的資料結構是vector,畢竟他可以好用啊。好了,以上短短的**就能解決乙個比較麻煩的迴圈巢狀問題,遞迴真是太好用了,不多說了,我要滾去學遞迴了。
將乙個整數 M 分解成 K 個數之和的方法數
記錄乙個遇見的問題,關於將乙個整數 m 分解成 k 個數之和 1,首先 k 個數不能有 0 如果有 0 也很簡單啊,將問題進一步分解成 將整數 m 分解成 k 1 個數之和 以此類推一直到分解成 1 個數之和,所有相加就可以得出數量 2,對於順序顛倒不算,比如將 3 分解成 2 個數之和,可以分成 ...
將乙個偶數分解成質數之和
目標 將乙個偶數,分解成質數之和。public class disintegrateevennumber 判斷乙個正整數是否是質數 public static boolean isprimenum int inputnum else return result 判斷是否是乙個偶數 public st...
將乙個數分解成多個加數相加的形式
看到這個命題首先想到的是暴力遞迴,除了這個辦法看起來好像沒有更好的辦法。不知道是不是。舉個栗子 比如 4 首先想到的是1 1 1 1,來抽象一下,數字n,它的所有組合情況一定是這樣的 1 f n 1 2 f n 2 3 f n 3 n 1 f 1 哈哈,有沒有看到一絲規律呢,其實遞迴退出條件都被你看...