正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 提高 2017 第一轮真题 › 第 23 题

NOIP 提高 2017 第一轮 第 23 题:递归计算整数拆分数

阅读程序 · 组合计数(离散与组合数学) · 答案 15

题目

```
#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;   
} 
```
输入:8 4   
输出:_________

本小题

请写出程序的输出结果。

答案

15

题解

考点定位

非递减非负整数拆分的递归计数。

解题过程

输入 8 4,调用 g(8,4,0),统计四个非递减非负整数之和为 8 的方案。首项最多为 8/4=2。

  • 首项为 0:剩余三个非递减非负整数之和为 8。第二项分别为 0、1、2 时,有 5、3、2 种,共 10 种。
  • 首项为 1:合法方案为 (1,1,1,5)、(1,1,2,4)、(1,1,3,3)、(1,2,2,3),共 4 种。
  • 首项为 2:只能是 (2,2,2,2),共 1 种。

总数为 10+4+1=15。

答案:15。

易错提醒

初始 x=0,允许取 0;递归把当前 i 作为下界,允许相邻项相等。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号