递推之合理放球

20人阅读 评论(0) 收藏 举报
分类:
描述

n个各不相同球放入m个相同的盒子里,球全部放完后,要求最后没有空盒!求不同的放法总数。

输入一行两个数n和m
n表示球数,m表示盒子数

(0<n≤20)(0≤m≤20)输出不同且合理的放法总数

样例输入

3 2
样例输出
3
提示递推

第二类stirling数

解题思路

    注意观察题目要求,盒子是一样的,球是不一样的,所以无论球放在哪个盒子都是一样的,但是不一样的是球要和那些球放在同一个盒子里还是它自己在一个盒子里。

    本题递推式比较简单,首先可以想到一共分为一下四种情况

1.m=0;

    当盒子数为0时,显然放法为0。(没有盒子怎么放球嘛)

2.m=1;

    当盒子数为1时,所有的球肯定要放在这一个盒子里面,所以方法为1。

3.m=n;

    题目要求最后不能有空盒子,所以当球的个数和盒子的个数相等时,每一个盒子放一个球刚好把这些球平分,所以方法为1

4.m<n;(这时比较复杂,耐心看下面)

    当盒子的数小于球的个数时,说明一定有一个或多个盒子中要放多个球。这时我们就要找递推公式了。当盒子数为m,球数为n-1时,设此时的放法f(n-1)(m);好,那现在增加一个球,球数变为n,那增加的这个球要放在哪里呢?仔细想一下,在没有放置增加的这个球时是不是每个盒子里面都有球?增加的这个球是不是只有两种放法

    ①这个球与其他球共用一个盒子:选择其中一个盒子(有m种选择),把这个球放在这个盒子里面,其它的球的放法刚才说了是f(n-1)(m),那此时的放法是不是为m*f(n-1)(m)。(我还是画画图吧,好理解些,看下面)


    ②这个球独占一个盒子:先选择一个盒子,把这个盒子里面的球腾空(移到其他盒子里面),然后把增加的这个球放在这个空盒子里面(这个盒子已经确定了放一个球),此时其它的n-1个球是不是要放在剩下的m-1个盒子里面?那此时的放法是不是为f(n-。1)(m-1)。

5.m>n;
    当盒子数大于球数的时候,就算一个盒子里面只放一个球都不够放,最后总有盒子是空的,所以此时方法为0
参考程序
#include<iostream>
using namespace std;
int m,n,i,j;
long long s[25][25];//定义成long long型,要不然会爆
int main()
{
	cin>>n>>m;
	for(i=1;i<=n;i++)
		for(j=0;j<=m;j++)
            if(j==0)s[i][j]=0;//盒子数为0
            else if(j==1)s[i][j]=1;//盒子数为1
                else if(i==j)s[i][j]=1;//盒子数等于球数
                    else if(i>j)s[i][j]=j*s[i-1][j]+s[i-1][j-1];//盒子数小于球数
                        else if(i<j)s[i][j]=0;//盒子数大于球数
	cout<<s[n][m];
	return 0;
}


查看评论

课程名称:用AI做毛绒质感小毛球

-
  • 1970年01月01日 08:00

放球问题

题目大意 给定n 个有标号的球,标号依次为1,2,…,n。将这n 个球放入m 个相同的盒子里,不允许有空盒,问有多少种放置方法。 题解   递推。   f[i,,j]=f[i-1,j-1]+...
  • qq_34593871
  • qq_34593871
  • 2016-07-10 21:39:48
  • 505

数学递推思想在程序中的应用(二)----------放球问题

A piece of cakeThis problem is very simple, i.e. just a piece of cake for you, excellent programmers...
  • sun_top
  • sun_top
  • 2009-05-17 12:42:00
  • 942

放球问题的组合数 总结

最近学习了一下组合数学,对其中的放球问题模型感觉比较有用,特来总结一下,纯当学习笔记。另外好久没更新了。。。懒癌晚期伤不起。。。 放球模型主要讲的就是将n个球放进m个篮子中的组合数。其中,根据球是否可...
  • dyx404514
  • dyx404514
  • 2015-04-20 16:24:36
  • 981

“n个球放入m个盒子,使用程序输出所有的放法”的c++回溯法

前言: 问题描述: 有n个相同的球,m个盒子(编号为1,2,……m),将这n个球放入这m个盒子中,要求输出所有可能的放置方法,输出格式为二维数组(如下例子),每行对应每个可能性,每列对应每个盒子中...
  • u011294019
  • u011294019
  • 2016-11-03 22:34:07
  • 671

递推 放苹果

【问题描述】把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。【输入】第一行是测试数据的数目t(0 &amp;lt;...
  • yihanyifan
  • yihanyifan
  • 2018-03-18 21:14:08
  • 14

【笔记】放球模型

放球模型描述了对n个球放入m个盒子中的不同方法进行计数的方法。 根据 球是否相同,盒子是否相同,盒子是否为空,可以分为8类组合模型。 (还可以根据n和m的大小关系进一步分为16种模型) http...
  • slowlight93
  • slowlight93
  • 2014-12-04 21:48:54
  • 757

nod-1418-放球游戏

有N个球排成一排,每个球都是R、G、B三种颜色之一。现在想重新排列这一排球,你要重复以下过程N次: 1)从原来的那排球中的最左侧取出一个球; 2)将取出的求插入新的球排列的任意位置,即可以放在最左或最...
  • zhang20072844
  • zhang20072844
  • 2016-04-16 18:17:10
  • 652

C++递推算法之放苹果

放苹果:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 #include int main() { int ...
  • C20190413
  • C20190413
  • 2017-05-26 13:06:00
  • 1237

排列组合-放球模型

排列: 从n个球中取出r个,放入r个不同的盒子里。 公式:  分步: 第一个盒子放球  P(n,r) = n * P(n-1,r-1); 分类: 第一个球放入盒子或者不放入盒子 P(n,r-1...
  • u013200703
  • u013200703
  • 2015-01-24 11:05:39
  • 664
    个人资料
    等级:
    访问量: 8155
    积分: 605
    排名: 8万+
    文章分类
    文章存档