給定任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。當n = 7,共有14種拆分方法:
這道題目我們可以想到其實應該用遞迴來做,而dfs又是可以使用遞迴求解,我們首先可以在遞迴函式裡進行拆分的列舉,需要拆分的數應該是能夠由哪一些數相加,怎樣設計遞迴函式dfs呢,我們應該清楚應該拆分n,比如n為7的時候,我們先拆了1,那麼n還剩下6對吧,所以我們設計的dfs遞迴函式應該包含兩個引數,比如,我們現在將n拆成了幾,然後我們先拿1先拆再拿2先拆這樣子做呢。
void
dfs(
int s,
int t)
else
s += i;
//回溯,加上拆分的數,以便產生所有可能產生的拆分 }}
}
我們如果要進行遞迴求解,一定要分析清楚遞迴函式的引數,設計引數。
#include
#include
using
namespace std;
int n;
int total;
int num[
100005]=
;int
print
(int t)
cout << num[t]
<< endl;
total++;}
void
dfs(
int s,
int t)
else
s += i;
//回溯,加上拆分的數,以便產生所有可能產生的拆分 }}
}int
main()
歡迎關注ly』s blog
ly』s blog
遞迴求解整數劃分問題
定義乙個陣列dnum用來儲存乙個劃分中的每個數,用show函式來對一次劃分進行一次輸出,運用遞迴的方法進行整數的劃分,遞迴的時時候考慮5種情況,分別是nm 1,n 1 m和 0 subject 計算機演算法設計與分析 title 整數劃分問題 輸出乙個整數的所有劃分並統計總劃分數 coder lea...
整數劃分問題遞迴
整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...
整數劃分問題 遞迴
1.程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法 recursion 2.乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 ...