递归做法
2025-07-29 23:16:34
发布于:浙江
3阅读
0回复
0点赞
因为和顺序无关,不妨设数列是非递减的(即每一个数大于等于前一个数)
#include <bits/stdc++.h>
using namespace std;
long long f(int n,int k,int mi){//n--剩余总和;k--剩余个数;mi--本次递归的数的最小值
long long ans=0;
if(k==1){
return 1;
}//如果只剩一个数,那么只有一种分法
for(int i=mi;i<=n/k;i++){ //剩下的k(本次递归的k)个数中,第一个数不大于平均数
ans+=f(n-i,k-1,i); //将剩余总和减去本次数,剩余个数减一,i作为下一次的最小值(减少运行次数)
}
return ans;
}
int main(){
int n,k;
cin>>n>>k;
cout<<f(n,k,1);//mi赋值1因为每个数至少为1(n恒大于k);
return 0;
}
这里空空如也
有帮助,赞一个