问题描述:
将正整数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;
}
}