整数划分/拆分--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;
}
其实就是让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;
}
相关文章推荐
- C++ 求解一整数划分问题
- C++ 读入一个整数,将各个数位上的数拆分下来并输出(从高位到低位)。
- C/C++ 整数划分问题
- 自然数拆分(整数划分一)
- 整数划分,性质一的疑惑,n拆分成k个数
- c++: 递归算法整数划分问题
- C++ 整数拆分方法详解
- C++ python STL 整数划分递归算法(即一个数分为几个数的和)
- 整数拆分问题_C++
- c++ 实现整数的拆分
- 一个关于把集合拆分的有意思的小题目(将1到N的连续整数组成的集合划分成两个子集合)
- C/C++面试之算法系列--从“整数转换成字符串”看算法的联想
- 整数划分问题
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 整数划分问题(C语言求解)
- 整数m-划分的词典序法生成
- 整数拆分(可重复)
- 整数按和拆分
- 从易到难编写C++程序,(5)问题:实现满足各种需求的随机整数生成类RandCreater
- C/C++面试之算法系列--整数数组的循环右移