zoukankan      html  css  js  c++  java
  • 放苹果(poj1664)

    把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

    思路:分两种情况
    1.苹果少于盘子。留空盘子没用,不然就重复了,没有意义,所以遇到苹果比盘子少的,把多余的盘子去掉,再排列;
    2.苹果多余盘子。苹果多,那就每个盘子先放一个苹果。一直这样递归,苹果多就每个盘子放苹果,苹果少就去掉盘子。
    到最后,苹果剩余0个或盘子剩余一个就是最终情况。然后往上递归。。(怎么感觉思路好乱)

    include<string.h>

    include <stdio.h>

    include

    using namespace std;
    int n,m;

    int L(int m,int n)
    {
    if (m0||n1)//苹果为0或只有一个盘子,返回仅有的一种情况
    return 1;
    if (m<n)//苹果少盘子多,
    return L(m,m);

    return L(m-n,n)+L(m,n-1);
    

    //1.每个盘子至少一个苹果,还剩m-n个,盘子有n个;
    // 2. 至少有一个盘子空着,递归。这时苹果数量m先不变,盘子n-1
    }
    /*
    1.至少一个盘子空着的情况。那么n-1个盘子,m个水果;(之所以n-1是因为可以一直递归,
    实现((((n-1)-1)-1)-1)..... 盘子可以一个一个少。 )
    2.每个盘子都满着的情况。 那就每个盘子都先放一个,然后再每个盘子放一个...,总有苹果不够的情况,
    那不就是至少有盘子空的情况么,转到情况1,完成)
    */
    int main()
    {
    int i,j,t;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d %d",&m,&n);
    printf("%d ",L(m,n));
    }
    return 0;
    }

  • 相关阅读:
    bzoj 1821: [JSOI2010]Group 部落划分 Group
    codevs 1217 借教室
    洛谷 P2678 跳石头
    洛谷 P1316 丢瓶盖
    洛谷 P2683 小岛
    洛谷 P2431 正妹吃月饼
    loj #6092. 「Codeforces Round #418」恋爱循环
    loj #6091. 「Codeforces Round #418」幻想特快
    loj #6090. 「Codeforces Round #418」尘封思绪
    前端移植说明
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13774039.html
Copyright © 2011-2022 走看看