1 solutions

  • 0
    @ 2023-12-3 21:35:24

    C++ :

    #include <stdio.h>
    #include <stdlib.h>
    
    int f(int p,int q);  //这里f就是递归求在q个框子里放p个苹果的方法总数的
    int main(){
            int m,n,i;
            scanf("%d",&i);
            while (i--){
                  scanf("%d%d",&m,&n);
                  printf("%d\n",f(m,n));      
            }
        return 0;
    }
    //递归函数的思想是,在n个盘子里放m个苹果,允许有盘子空,按层次可以划分成如下的子问题:1》在n个盘子中不空的放。显然此时方法种数相当于在n个盘子里面放(m - n)个苹果2》n个盘子中至少有一个空,即盘子规模小1的子问题。
    int f(int p, int q){
        int z;
        if(p == 0|| q == 1) z = 1; //这里是两个递归结束条件,既递归的出口;要么就是所有的苹果 //放到一个盘子里,要么就是没有苹果了(这种结果的产生如下)
             else{
                  if(p < q) z = f(p,p); //盘子数大于苹果数,那么就相当于在p个盘子 //里放p个苹果。
                       else z = f(p-q,q)+ f(p,q-1); //总问题和子问题
             }
        return z;
    }
    
    • 1

    Information

    ID
    1318
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    (None)
    # Submissions
    0
    Accepted
    0
    Uploaded By