阅读程序写结果:
#include<iostream>
using namespace std;
int g(int m, int n, int x)
{
int ans = 0;
int i;
if (n == 1)
return 1;
for (i = x; i <= m / n; i++)
ans += g(m - i, n - 1, i);
return ans;
}
int main()
{
int t, m, n;
cin >> m >> n;
cout << g(m, n, 0) << endl;
return 0;
}
输入:7 3 输出:_________
看到递归拆分整数 → 先想‘非递减排列’的枚举边界(i≤m/n)。
易混 n=1 边界(应返回 1 而非 0);循环上限 m/n 写错会漏算;递归传参 i 保证非递减。
考点:递归枚举|整数划分
输入 m,n,调用 g(m,n,0) 计算把 m 拆成 n 个非负整数且非递减排列的方案数。