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

    描述

    把一个正整数m分成n个正整数的和,有多少种分法?

    例:把5分成3个正正数的和,有两种分法:

    1 1 3

    1 2 2

     
    输入
    第一行是一个整数T表示共有T组测试数据(T<=50)
    每组测试数据都是两个正整数m,n,其中(1<=n<=m<=100),分别表示要拆分的正数和拆分的正整数的个数。
    输出
    输出拆分的方法的数目。
    样例输入
    2
    5 2
    5 3
    样例输出
    2
    2

           就是把整数数n划分中m个正整数,共有多少种情况?

           f(n,m)表示把n划分成m个正整数的划分种数;

           分情况讨论:

           (1)m=1时,划分为{n};n = m 时,划分中都是1;

           (2)n<m时,不能划分为负数,所以不可能,为0;(要讨论的);

           (3)n>m时,分两部分,一部分是划分中包含1( f(n-1,m-1) ),另一部分是划分中不包含1( f(n-m,m) );

            对第(3)种进一步解释:

            包含1,所以只需把n-1划分成m-1个数了;不包含1,就是相当于先把m个位置各放一个1,再把其余的放在m个位置(当然这也可能不存在,所以情况(2)不能省).

    代码:

    #include<stdio.h>

    int fun(int a,int b)
    {
    if(b == 1 || a == b) return 1;
    if(a < b) return 0;
    if(a > b) return fun(a-1,b-1) + fun(a-b,b);
    }

    int main()
    {
    int T,m,n;
    scanf("%d",&T);
    getchar();

    do
    {
    scanf("%d%d",&m,&n);
    printf("%d\n",fun(m,n));

    }while(--T);

    // system("pause");
    return 0;
    }
  • 相关阅读:
    Java-运算符
    Java-类型转化
    Java-数组
    Java-循环结构(for,while)
    Java-选择结构(if-else)
    Java-数据类型(引用类型)
    HDFS JournalNode 故障
    Grok patterns 汇总
    HBase 查询导致RegionServer OOM故障复盘
    【翻译】Spark 调优 (Tuning Spark) 中文版
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2280043.html
Copyright © 2011-2022 走看看