• 递归之整数划分问题


    一、问题描述

    将正整数n表示成一系列正整数之和:
    n=n1+n2+...+nk;(其中n1>=n2>=...>=nk)
    如6:共有11种
    6=6;
    6=5+1;
    6=4+2; 6=4+1+1;
    6=3+3; 6=3+2+1; 6=3+1+1+1;
    6=2+2+2; 6=2+2+1+1; 6=2+1+1+1+1;
    6=1+1+1+1+1+1;

    如5:共有7种

    5=5;

    5=4+1;

    5=3+2;         5=3+1+1;

    5=2+2+1;     5=2+1+1+1;

    5=1+1+1+1+1;

    二、问题分析

    从整数划分的例子中,可以采用递归的思想去解决。如整数6,它的第一步是从6-1;第二步则是从第一步的差以及小于第一步的数开始,依次类推,直至这些整数之和为6.

    如6=5+1;第一步是5,第一步的差是6-5=1,所以第二步从第一步5和第一步的差1两者较小数1开始递减;

    6=1+1+1+1+1+1,第一步是1,第一步的差是6-1=5,所以第二步从第一步1和第一步的差5两者较小数1开始递减,这样后面只能是1,这样才能保证划分的规律性。

    三、程序设计

    #include<iostream>

    using namespace std;

    int num=0; //记录划分的类别数

    void int_part(int n,int j)                            //n记录整数的剩余数,j记录上一步的数,确保是按照递减的数累加
    {
            if(n==0)                                          //如果刚好分配完,则数目加1
           {
               num++;
               return;
           }

           for(int i=n<j?n:j;i>0;i--)                     //i取两者之间的小值,利用条件表达式
                 int_part(n-i,i);

    }

    void main()
    {
          int n;

          cout<<"请输入一个正整数:";
          cin>>n;

          int_part(n,n);                                      //整数划分函数,初始都设为n

          cout<<"划分的数目是:"<<num<<endl;

          while(1);
    }

    四、程序结果

  • 相关阅读:
    ActiveMQ消息队列技术融合Spring
    ActiveMQ消息队列技术Demo
    网页静态化技术Freemaker
    Solr的基本语法
    Solr的页面展示以及高亮显示
    Solr的了解与配置
    Angular中上传图片到分布式文件服务器FastDFS上
    分布式文件服务器FastDFS的使用
    自我学习笔记01
    数组转换成List集合
  • 原文地址:https://www.cnblogs.com/cxmhy/p/4464060.html
Copyright © 2020-2023  润新知