• nyoj_176_整数划分(二)_201404261715


     

    整数划分(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    把一个正整数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
    来源
    [张云聪]原创
    上传者
    张云聪
     
    在整数划分(一)的基础上改编的,整数划分(一)里有详解:http://www.cnblogs.com/xl1027515989/p/3603533.html
    针对此题,方法和整数划分(一)类似:

    首先 定义f ( i , j )为整数  i  分成 j  个整数 的情况
    经过分析可得f(i, j )可转化为两个部分:
    一:  假设 分成的  j  个整数中 不包含1。。那么 此时 f (i-j,j)就是这部分的总情况,既然想让他不包含1,就先将j个整数都分为1,此时i变为i-j,再将i分为j个整数,这j个整数再加上原先分的1,就肯定不会再有1出现了。如果i-j<j的话,f (i-j,j)的值为0
    二: 假设分成的j个整数至少有一个1。。那么此时f(i-1,j-1)

    代码如下(一)

     

     1 #include <stdio.h>
     2 int f(int m,int n)
     3 {
     4     if(m==n||n==1)
     5     return 1;
     6     else if(m<n)
     7     return 0;
     8     else if(m>n)
     9     return f(m-1,n-1)+f(m-n,n);
    10 }
    11 int main()
    12 {
    13     int T;
    14     scanf("%d",&T);
    15     while(T--)
    16     {
    17         int m,n;
    18         scanf("%d%d",&m,&n);
    19         printf("%d
    ",f(m,n));
    20     }
    21     return 0;
    22 }
    23 //AC
    24 //首先 定义f ( i , j )为整数  i  分成 j  个整数 的情况
    25 //经过分析可得f(i, j )可转化为两个部分:
    26 //一:  假设 分成的  j  个整数中 不包含1。。那么 此时 f (i-j,j)就是这部分的总情况,既然想让他不包含1,就先将j个整数都分为1,此时i变为i-j,再将i分为j个整数,这j个整数再加上原先分的1,就肯定不会再有1出现了。如果i-j<j的话,f (i-j,j)的值为0
    27 //二: 假设分成的j个整数至少有一个1。。那么此时f(i-1,j-1)
    28 //
    29  

     

    代码如下(二):

     1 #include <stdio.h>
     2 int s[110][110];
     3 int f(int m,int n)
     4 {
     5     if(s[m][n]!=0)
     6     return s[m][n];//用数组保存已处理过的数据节约时间 
     7     if(m==n||n==1)
     8     return 1;
     9     else if(m<n)
    10     return 0;
    11     else if(m>n)
    12     return s[m][n]=f(m-1,n-1)+f(m-n,n);
    13 }
    14 int main()
    15 {
    16     int T;
    17     scanf("%d",&T);
    18     while(T--)
    19     {
    20         int m,n;
    21         scanf("%d%d",&m,&n);
    22         printf("%d
    ",f(m,n));
    23     }
    24     return 0;
    25 }
    26 //AC

     

  • 相关阅读:
    MySQL InnoDB 存储引擎探秘
    MySQL优化面试
    技术面试老是有劲使不出,该怎么办?
    详解RPC远程调用和消息队列MQ的区别
    ConcurrentHashMap1.8源码分析
    kafka topic制定规则
    GitLab本地、远程更新已经fork的项目
    Swagger2使用参考
    分布式配置中心选型
    搭建Elasticsearch平台
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3691975.html
Copyright © 2020-2023  润新知