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

将整数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;

}

递归法是一种通过将复杂问题分解成更小的相似子问题来求解问题的技术,在C++中处理整数划分问题时,递归通常用于寻找所有可能的数字组合,使得它们之和等于给定的目标值。例如,给定一个整数n和一个目标值target,我们要找出所有将n划分为若干个非整数的组合。 这是一个经典的动态规划问题,可以用递归来实现。下面是一个简单的示例: ```cpp #include <vector> using namespace std; void integerPartition(vector<int>& target, int n, vector<vector<int>>& result) { if (n == 0 && target.empty()) { // 当n为零并且当前目标列表为空,找到了一个解决方案 result.push_back({}); } else { for (int i = 0; i <= n; ++i) { // 遍历所有可能的拆分点 if (i > target[0]) break; // 如果超过第一个目标值,不可能再匹配 integerPartition(target, n - i, result); // 递归尝试剩下的部分 if (i != 0) { // 将当前目标值添加到结果中(如果存在) vector<int> newTarget = target; newTarget.erase(newTarget.begin()); // 移除已使用的值 result.push_back({newTarget[i - 1], result.back()}); // 更新结果,添加新的元素 } } } } vector<vector<int>> findIntegerPartitions(int n, int target) { vector<vector<int>> result; vector<int> targetList = {n}; integerPartition(targetList, n, result); return result; } ``` 在这个函数中,我们首先检查基本情况(n=0且无剩余目标),然后逐个尝试从剩余的n值中减去目标数组中的每个元素,同时维护一个记录当前已选择数值的临时结果。递归会一直进行直到找到所有可能的划分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值