将整数N分成K个整数的和且每个数大于等于A 小于等于B 求有多少种分法
其实就是让K个整数的和为N,且这K个整数都在A和B之间,只要递归时保证K个整数非降序就可保证划分方法的唯一性。如果直接看程序不是很明白的话,可以先跑个结果,然后断点调试去看,那样会更好理解递归。
#include<iostream>
#include<vector>
using namespace std;
vector<int> a;
int num;
int IntgerDis(int n,int k,int min,int max)
{
if(n<min)//n<min也是保证不重复的重要条件,保证K个整数非降序
{
return0;
}
if(k==1&&n<=max)
{
num++;
cout<<"第"<<num<<"种分法为:";
for(inti=0;i<a.size();i++)
{
cout<<a[i]<<'+';
}
cout<<n<<endl;
return1;
}
if(k==1) //上面情况没有返回值,说明n>max,所以在此返回0
{
return0;
}
intsum=0;//初始化为0很重要
for(intt=min;t<=max;t++)//保证K个整数非降序,这样不会出现重复的情况
{
a.push_back(t);
sum+=IntgerDis(n-t,k-1,t,max);
a.pop_back();
}
returnsum;
}
int main()
{
int N,K,A,B;
cin>>N>>K>>A>>B;
inttim=IntgerDis(N,K,A,B);
cout<<"总分法为: ";
cout<<tim<<endl;
return0;
}