1. 程式人生 > >整數劃分並輸出(DFS)

整數劃分並輸出(DFS)

問題描述:

將正整數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;
	}
}