您的位置:首页 > 编程语言 > C语言/C++

整数划分/拆分--C++

2014-07-08 16:53 225 查看
将整数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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: