整數劃分並輸出(DFS)
阿新 • • 發佈:2019-01-03
問題描述:
將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整數n的這種表示稱為正整數n的劃分。
問題1:
輸出整數n的所有可能的劃分,如:
輸入:6
輸出: 5+1
4+2
4+1+1
3+3
3+2+1
3+1+1+1
2+2+2
2+2+1+1
2+1+1+1+1
1+1+1+1+1+1
10
解題思路:深搜,用mark陣列儲存每次從大到小嚐試的數,如果可以就再深入一層嘗試下一個。
#include <iostream> using namespace std; int mark[256]; int n,ans; void DFS(int sum, int deepth, int max) { if (sum == n) { cout << mark[0]; for (int i = 1; i < deepth; i++) { cout <<"+"<<mark[i] ; } cout << endl; ans++; } else if(sum<n) //還要繼續嘗試 { for (int i = max; i > 0; i--) { mark[deepth] = i; DFS(sum + i, deepth + 1, i); } } } int main() { while (cin >> n) { //n==1時另加判斷,就不寫了 ans = 0; DFS(0, 0, n - 1); cout << ans << endl; } }