#include <iostream> using namespace std; const int N = 205; int n, k, ans; //k:当前还需要拆分的份数 //P:上一份拆分的数字 //n:当前剩余待拆分的整数数值 void dfs(int k, int p, int n) //(初始状态:需要分 3 份,上一份的值为 0,剩余 7 要分配) { if(k == 1) { ans++; return; } for(int i = 1; i <= n / k; i++) { if(i >= p)//避免重复,比如前面拆出较小的数,后面拆的数不小于前面的 { dfs(k - 1, i, n - i); } } } int main() { cin >> n >> k; dfs(k, 0, n); cout << ans ; return 0; } //第一层递归(k=3;p=0;n=7) //循环 i 从 1 到 n/k=7/3=2(即 i=1,2) //条件 i >= p(p=0,所以 1 和 2 都满足) //当 i=1 时: // 递归调用 dfs(k=2, p=1, n=7-1=6); // 进入第二层递归分支A //当 i=2 时: // 递归调用 dfs(k=2, p=2, n=7-2=5) // 进入第二层递归分支B //第二层递归 //分支 A:dfs(k=2, p=1, n=6) // 循环 i 从 1 到 n/k=6/2=3(即 i=1,2,3) // 条件 i >= p(p=1,所以 1、2、3 都满足) // A1:i=1 时: // 递归调用 dfs(k=1, p=1, n=6-1=5) // 满足 k==1,ans 加 1(ans=1,对应分法 1+1+5) // A2:i=2 时: // 递归调用 dfs(k=1, p=2, n=6-2=4) // 满足 k==1,ans 加 1(ans=2,对应分法 1+2+4) // A3:i=3 时: // 递归调用 dfs(k=1, p=3, n=6-3=3) // 满足 k==1,ans 加 1(ans=3,对应分法 1+3+3) //分支 B:dfs(k=2, p=2, n=5) // 循环 i 从 1 到 n/k=5/2=2(即 i=1,2) // 条件 i >= p(p=2,只有 i=2 满足) // B1:i=2 时: // 递归调用 dfs(k=1, p=2, n=5-2=3) // 满足 k==1,ans 加 1(ans=4,对应分法 2+2+3)