编译通过的,给你做参考。时间超出,就是分大数的时候不仔细。
```cpp
#include<iostream>
using namespace std;
int count=0;
//以7分3份为例
//有七个球 【 0 0 0 0 0 0 0 】
//向这些球中间插入两根棍子,分割这些球,例如 【 0 0 0 0 | 0 0 | 0 】这样就分成了4+2+1
//为了保证【4|2|1】不和【1|2|4】重复,只需要保证大数一定在前面
//给棍子插入的位置做编号【 0 (1) 0 (2) 0 (3) 0 (4) 0 (5) 0 (6) 0 】,共有(6)个位置可以插入
//但是因为要保证大数在前,第一根棍子不可以插入(1)位置
//这是因为 7分3,平均数是2.333,那么第一位数必须是2.333向上取整,即第一根棍子的位置>=3。(如果平均数==2,则>=2)
//同样地,在确定第一根棍子的位置后,第二根棍子的位置也必须从【剩余长度/(剩余棍子数+1)】开始向上取整
//LastLen上个数的长度,RemainLen剩余数的长度,ReaminStic剩余棍子数,每根棍子分割一次剩余数
void fun(int const LastLen,int const RemainLen,int const RemainStick){
//棍子用完,一次分割完成
if(RemainStick==0){
count++;
return;
}
if(LastLen==0){//LastLen==0表示这是第一根棍子
int i=RemainLen/(RemainStick+1);//如果将剩余的数等分,那么第一位数一定大于等于这个平均数
if(RemainLen%(RemainStick+1)!=0) i++;//如果余数不为零,表示等分失败,第一位数肯定大于平均数
for(;i<RemainLen;i++){
fun(i,RemainLen-i,RemainStick-1);
}
}
else{
int i=RemainLen/(RemainStick+1);
if(RemainLen%(RemainStick+1)!=0) i++;
for(;i<RemainLen && i<=LastLen;i++){
fun(i,RemainLen-i,RemainStick-1);
}
}
}
//将整数n分成k份
//大数始终在前
int main(){
int n,k;
cin>>n>>k;
if(n<k){
cout<<"NO SOLUTION"<<endl;
return 0;
}else if(k==1){
cout<<1<<endl;
return 0;
}
fun(0,n,k-1);
cout<<count<<endl;
}
```
by XianZai @ 2024-05-09 10:32:44
@[XianZai](/user/1346964) 好的,感谢!
by spessert @ 2024-05-09 18:28:36