• poj 1664 放苹果【M的N划分】


                                                   放苹果

     

    Description

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

    Input

    第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

    Output

    对输入的每组数据M和N,用一行输出相应的K。

    Sample Input

    1
    7 3
    

    Sample Output

    8
     
    【解题思路】

    设f(m,n)为把m个苹果放到n个盘子中的方法数,m>=0,n>=0.

    1. 若m和n中任何一个等于0,那么f(m,n) = 1,注意不是等于0,因为相当于就那么一种结果,就是不往盘子里面放(没有苹果),或者,连盘子都没有。
    2. 若n=1,显然对于任意的m>=0 有f(m,1) = 1,若m=1,显然对于任意的n>=0 有f(1,n) = 1
    3. 接下来讨论m>1 && n>1的情况:     

                 若 m < n 则 f(m,n) = f(m,m)。即空哪几个盘子都是一样的

                 若 m>=n 则 大体有两种放法:

                        第1种情况:至少有一个盘子为空,即什么也不放,这部分的方法数为f(m,n-1);

                        第2种情况:全部盘子都有苹果,那么先从m个苹果中抽取出n个出来,各个盘子分一个,考虑剩下的m-n个苹果放到n个盘子里的放法,这样就成功把f(m,n)降到了f(m-n,n)。          

                        所以,m>=n时,有f(m,n) = f(m,n-1) + f(m-n,n);

    AC代码:
     1 #include<stdio.h>
     2 int f(int x,int y)
     3 {
     4     if(y==1||x==0) return 1;//盘子数为1,或者没有苹果了
     5     if(x<y) return f(x,x);//苹果数小于盘子的数目时
     6     return f(x,y-1)+f(x-y,y);//至少一个盘子为空或者每个盘子都放了苹果
     7 }
     8 
     9 int main()
    10 {
    11     int t,m,n,i;
    12     scanf("%d",&t);
    13     for(i=0;i<t;i++)
    14        {
    15         scanf("%d%d",&m,&n);
    16         printf("%d
    ",f(m,n));
    17     }
    18        return 0;
    19 }
  • 相关阅读:
    [Leetcode] Median of Two Sorted Arrays
    [Jobdu] 题目1463:招聘会
    [Leetcode] Merge Two Sorted Lists
    [Leetcode] Combinations
    [Leetcode] Populating Next Right Pointers in Each Node II
    [Leetcode] Insertion Sort List
    redis在Web中的使用
    设计模式:单例模式
    设计模式:基本法则
    设计模式:工厂模式
  • 原文地址:https://www.cnblogs.com/123tang/p/5784803.html
Copyright © 2020-2023  润新知