输入 6
输出11
划分情况:
6
1 5
2 4
3 3
1 1 4
1 2 3
2 2 2
1 1 1 3
1 1 2 2
1 1 1 1 2
1 1 1 1 1 1
思路:在所有情况中任选一种,其包含的数字个数一定在[1,n]的范围内,其中任意一个数字也一定在[1,n]这个范围内
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;
int path[100];
void fun(int u,int lim,int start)
{
if (u > lim)
{
int sum = 0;
for (int i = 1; i <= lim; i++)
sum += path[i];
if (sum == n)
{
for (int i = 1; i <= lim; i++)
cout << path[i] << " ";
cnt++;
}
if (sum == n)
cout << endl;
return;
}
for (int i = start; i <= n; i++)//其中任意一个数字也一定在[1,n]这个范围内
{
path[u] = i;
fun(u + 1, lim,i);
}
}
int main()
{
cin >> n;
int res = 0;
for (int i = 1; i <= n; i++)//在所有情况中任选一种,其包含的数字个数一定在[1,n]的范围内
{
fun(1, i,1);
}
cout << cnt << endl;
return 0;
}