问题描述:

将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。

问题1:

输出整数n的所有可能的划分,如:

输入:6

输出: 5+1;

  4+2,4+1+1;

  3+3,3+2+1,3+1+1+1;

  2+2+2,2+2+1+1,2+1+1+1+1;

  1+1+1+1+1+1。

我的思路:这种问题已经遇到过很多了,递归搜索所有可能的情况,同时为了记录下每一步的情况,那么就要用到一个数组mark来存储每一步的数,然后递归同时要传递递归的深度k。还有个问题就是递归下一个数的时候,因为是递减的排列的。所以我们还必须记录下上一个的数,然后下一个数必须小于或者等于上一个数。最后递归函数还有有个参数记录当前的长度,来判断是否能够组成我们想要的长度,不能的话就回溯,继续往下一个数去尝试。OK!

代码:

//整数划分问题
#include <stdio.h>

int mark[10];
int n;

void Divid(int now,int k,int prio)  
 {
    //now记录当前长度,k记录深度,prio记录前一个的值。
    int i;
    if(now > n) return;  //不合适,返回。
    if(now == n)
    {
        for(i = 0; i < k-1; i++)
            printf("%d+",mark[i]);
        printf("%d\n",mark[i]);
    }
    else
    {
        for(i = prio; i > 0; i--)
        {
            if(i <= prio)  //必须必前一个要小
            {
                mark[k]=i;
                now+=i;
                Divid(now,k+1,i);
                now-=i;
            }
        }
    }
 }

int main()
{
    scanf("%d",&n);
    Divid(0,0,n-1);
    return 0;
}
/5/29 14:17

问题2:求正整数n的不同划分个数,将最大数n1不大m的划分记住做q(n,m),叫做n的m划分。

输入:n m

输出:n的m划分的总个数。

我的思路:首先要找出递归的公式来,首先分析几种简单的情况,n==1||m==1可以直接得出结果为1;而当n<m时,可以直接求出q(n,n);当n=m时,因为对于n本身只有一种情况,即n,所有可以直接用1+q(n,n-1)来求。最后当n>m时,可以用q(n,m-1)+q(n-m,m),其中q(n-m,m表示的时当m固定后,求剩下可能的情况。参考下图:

代码:

//求整数划分的个数
#include <stdio.h>

int Divid(int n, int m)
{
    if (n == 1 || m == 1) return 1;  //必须是或
    if (n < m) return Divid(n,n);
    if (n == m) return 1 + Divid(n,n-1);
    return Divid(n,m-1) + Divid(n-m,m);
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%d\n",Divid(n,m));
    return 0;
}
/5/29 14:35

递归--整数划分问题相关推荐

  1. 算法设计与分析——分治与递归——整数划分问题

    将正整数n表示为一系列正整数之和, n=n1+n2+n3+n4+......+nk (其中,n1>=n2>=n3>=n4........>=nk>0,k>=1) 正 ...

  2. 整数划分问题(续)(非递归法)

    上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法: 一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存 ...

  3. 整数划分问题(递归法)

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...

  4. 整数划分问题(路径输出)【递归求解方式】

    简述 具体的算法解释可以参照下面链接,非常详细~ 整数划分问题[递归以及递推求解方式] 代码 #include <iostream> using namespace std; #inclu ...

  5. 整数划分问题【递归以及递推求解方式】

    简述 用一系列正整数之和来表示一个整数,称之为整数划分.而整数划分问题则对于某个数字,输出对应整数划分的数量. 先写递归,有了递归之后,就换用递推来加快速度. 算法思路 q(n, m)表示,n这个整数 ...

  6. Bailian4117 简单的整数划分问题【整数划分+记忆化递归】

    4117:简单的整数划分问题 总时间限制: 100ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=n ...

  7. 递归法:整数划分问题(怎么进行划分呢)

    问题:整数划分问题 例如,正整数6有如下11种划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+ ...

  8. java整数划分递归_整数划分问题(递归法)

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...

  9. 整数划分问题 递归 动态规划 openjudge 百练 python

    4117:简单的整数划分问题 http://bailian.openjudge.cn/practice/4117 4119:复杂的整数划分问题 http://bailian.openjudge.cn/ ...

最新文章

  1. SQL Server-聚焦什么时候用OPTION(COMPILE)呢?
  2. 人脸识别(二)——训练分类器的补充说明
  3. ASP.NET MVC中为DropDownListFor设置选中项的方法
  4. 文献记录(part90)--A novel density-based clustering algorithm using nearest neighbor graph
  5. vscode 遇到的迷之bug nvm is not compatible with the npm config prefix
  6. golang学习之旅(1)
  7. resultset 代码复用
  8. 使用Java对sftp带有中文路径的文件夹进行下载,乱码打不开文件夹
  9. Android Sensor Framework(狠详)
  10. 一文详解3D相机面临的困难问题和解决方案
  11. 基于Yolov5目标检测的物体分类识别及定位(三) -- 训练、测试
  12. linux build bash,Win10 Build 14316启用Linux Bash 环境图文教程
  13. WinDirStat下载使用指南,处理电脑空间神器
  14. 最佳Icon图标库推荐,收藏等于学会
  15. wifi mouse linux,WiFi Mouse Pro
  16. Google Sheet 学习笔记
  17. 论文写作——用excel和ppt做好看的论文图
  18. linux管理进程ps命令,ps命令进程管理-linux
  19. (论文笔记)SC4D: A Sparse 4D Convolutional Network for Skeleton-Based Action Recognition
  20. 关于app store distribution出现的'armv7'与最小版本'3.0'不兼容的问题

热门文章

  1. 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
  2. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
  3. 【Android 应用开发】 Fragment 详解
  4. 四种Sandcastle方法生成c#.net帮助类帮助文档
  5. Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
  6. 第1次作业+105032014074
  7. Window.resizeTo()
  8. 图像五值化与基于三值图像的车牌识别(1)
  9. OS中关于父子进程的执行顺序和多个子进程之间的执行顺序(整理)
  10. iOS开发如何避免安全隐患