zoukankan      html  css  js  c++  java
  • 整数的划分(分治递归)

            正整数n有几种划分?每个划分有一个数最大,记为m,于是f(n,m)表示把n划分,最大数是m的划分数。所以f(n,n)即为所求。

            递归!因为可以划出与母问题同质的问题。

            分情况讨论:

            (1)m=1,划分中所有数都是1;n=1,划分为{1};所以这两种特殊情况只有一种划分;

            (2)n=m,就是分成两部分,一部分最大数是m-1( f(n,m-1) ),一部分最大数是m( 本身 );

            (3)n<m,都是正整数,所以最大数相当于n;

            (4)n>m,最一般,分成两部分,一部分最大数是m( f(n-m,m) ),一部分是m-1( f(n,m-1) );

         对第(4)种情况进一步解释:

          n>m时,f(n,m)=f(n-m,m)+f(n,m-1);第一部分就是m已经内定了,只需把n-m划分,因为n的划分中最大数是m,所以n-m划分中最大数一定<=m;第二部分就是最大数是m-1了。

    例子:

    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+1

    代码:

    #include<stdio.h>
    #include<stdlib.h>
    
    int split(int n,int m);
    
    int main()
    {
      int a,result;
      scanf("%d",&a);
      result = split(a,a);            
      printf("%d\n",result); 
                  
      system("pause");
      return 0; 
    }
    
    int split(int n,int m)
    {
       if(n == 1 || m == 1) return 1;
       if(n == m) return split(n,n-1) + 1;
       if(n < m) return split(n,n);    
       if(n > m) return split(n-m,m) + split(n,m-1);
    }
    
    
    
  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2280007.html
Copyright © 2011-2022 走看看