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;
    }
  • 相关阅读:
    13年7月memory point
    getDefinitionByName getDefinition 区别
    cocos2d-html5版日历组件
    一个js对象的代码结构
    计算机操作系统复习
    计算机组成原理复习
    最新的hustoj搭建姿势
    推荐算法学习笔记
    BUPT 2012复试机考 4T
    BUPT 2012复试机考 3T
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2280043.html
Copyright © 2011-2022 走看看