将m个相同的球全部放到n个相同的盒子里面有几种放法,盒子不能为空,m>=n

盒子不能为空,所以可以当成将m-n个球放到n个盒子里,盒子可以为空。

比如将10个球放到5个盒子里,可以当成5个球放到5个盒子里,盒子能为空。接着,再分情况,将球分为

(5,0,0,0,0)

(4,1,0,0,0)或(2,3,0,0,0)

(3,1,1,0,0)或(2,2,1,0,0)

(2,1,1,1,0)

(1,1,1,1,1)

也就是1个盒子不能为空,2个盒子不能为空,3个盒子不能为空,到5个盒子都不能为空。

是不是跟一开始的时候很像,m个球放到n个盒子不能为空?这时候想到了什么?对,递归。

用一个函数fun(m,n)来获取m个球放到n个盒子里不能为空的情况(也可以用能为空的,这里用的是不能为空的)

上面的可以转换成

fun(5,1)+fun(5,2)+fun(5,3)+fun(5,1)+fun(5,0)    //其中n为0的情况即刚好每个盒子分到一个球,这个也要算进去

如果有非递归方法的,欢迎提出来探讨^_^,我自己的理解,不知道对错,有错请指出,谢谢!

//============================================================================
// Name        : test.cpp
// Author      : AstrayLinux
//============================================================================
#include <iostream>
using namespace std;int fun(int m, int n) {if (m < n)   //m<n返回0return 0;if (n == 1 || (m - n) <= 1) //盒子为1时,球只有一个或0(0个即球刚好均分),时都只有一种分配方法return 1;int s = 0, count;   //s记录总数,count为递归次数if (m - n < n)       //去掉每个盒子分配的一个球后,球的数量少于盒子数,则只要递归球的个数次count = m - n;   //球数少的情况elsecount = n; //盒子数少的情况for (int i = 1; i <= count; i++) {s += fun(m - n, i); //递归}return s;
}int main(int argc, char **argv) {cout << "\t";for (int i = 1; i <= 15; i++) {cout << i << "\t";}cout << endl;for (int i = 1; i <= 15; i++) {cout << i << "\t";for (int j = 1; j <= 15; j++) {cout << fun(i, j) << "    ";}cout << endl;}
}
//下面是结果
//      1    2    3     4     5     6     7     8     9     10   11   12   13   14   15
//1     1    0    0     0     0     0     0     0     0     0    0    0    0    0    0
//2     1    1    0     0     0     0     0     0     0     0    0    0    0    0    0
//3     1    1    1     0     0     0     0     0     0     0    0    0    0    0    0
//4     1    2    1     1     0     0     0     0     0     0    0    0    0    0    0
//5     1    2    2     1     1     0     0     0     0     0    0    0    0    0    0
//6     1    3    3     2     1     1     0     0     0     0    0    0    0    0    0
//7     1    3    4     3     2     1     1     0     0     0    0    0    0    0    0
//8     1    4    5     5     3     2     1     1     0     0    0    0    0    0    0
//9     1    4    7     6     5     3     2     1     1     0    0    0    0    0    0
//10    1    5    8     9     7     5     3     2     1     1    0    0    0    0    0
//11    1    5    10    11    10    7     5     3     2     1    1    0    0    0    0
//12    1    6    12    15    13    11    7     5     3     2    1    1    0    0    0
//13    1    6    14    18    18    14    11    7     5     3    2    1    1    0    0
//14    1    7    16    23    23    20    15    11    7     5    3    2    1    1    0
//15    1    7    19    27    30    26    21    15    11    7    5    3    2    1    1



												

将m个相同的球全部放到n个相同的盒子里面有几种放法,盒子不能为空相关推荐

  1. n个相同的球放入m个相同的盒子

    在复习组合数学的时候,遇到这样一个问题: n个相同的球放入m个相同的盒子里,在可以有空盒和没有空盒的情况下,各有多少种方法? n个相同的球放入m个相同的盒子,先考虑可以存在空盒的情况. 可以这样思考: ...

  2. 5个球放入3个箱子_排列组合问题,把5个相同的球放到三个相同的盒子里,要求每个盒子都有球,则不同的放球方法是多少?...

    一个一个的列出来就好了. 2种.311和221 ----............... 修改. 这本来就是从一个一个列举出来的.要用到排列组合的都是一些特定的情况.不过这道题貌似用不上. 比如5个球变 ...

  3. 算法题放苹果:把M个相同的苹果放到N个完全相同的盘子里,有多少种放法?

    文章目录 题目描述 题解 思路1 暴力递归 思路2:缓存思想--动态规划来优化暴力递归 题目描述 链接:点我做题 题解 思路1 暴力递归   我们利用递归来解决这个问题,不妨这样思考,假设apples ...

  4. NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(二)

    一.计算机基础部分 bios bios_百度百科 如果某个进制下7*7=41等式成立,那12*12=? 如果某个进制下7*7=41等式成立,那12*12=?_百度知道 计算机加电后操作系统启动过程 计 ...

  5. 浅谈n个球和m个盒子之间的乱伦关系

    无视标题,从我做起 update in 2018.10.1: 补充了"至多为1的四中情况" 这玩意儿的官方名字应该是叫"Twelvefold way",共用12 ...

  6. 算法题(模板)——N个球放入M个盒子中

    题目:n个球放入m个盒子中,有多少种放法 情况一:球同,盒不同,无空盒 也就是所有球都是一样的,但是盒子有区别,且不能出现空放的情况. 采用插板法,相当于在n-1个空隙中,插入m个盒子,而由于不能有空 ...

  7. SDNU 1011.盒子与球(斯特林函数)

    Description 现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子.则有多少种放法? Input n, r(0 <= n, r <= 10). ...

  8. SDNU 1011.盒子与球

    SDNU 1011.盒子与球 Time Limit: 1000 MS Memory Limit: 32768 KB Total Submission(s): 885 Accepted Submissi ...

  9. AlvinZH双掉坑里了

    AlvinZH双掉坑里了 时间限制: 1000 ms 内存限制: 65536 kb 题目描述 AlvinZH双掉进坑里了! 幸运的是,这坑竟然是宝藏迷宫的入口.这一次AlvinZH机智地带了很多很多背 ...

  10. 排列组合之插板法及变形

    主要用于"相同元素"分到"不同容器"的排列组合. [例1] 共有10本相同的书分到7个班里,每个班至少要分到一本书,问有几种不同分法? [解析]注意,这里面有个 ...

最新文章

  1. GridView 72 般绝技
  2. hdu5399(找规律。。。)
  3. 使用jqprint插件完成页面打印
  4. sed搜索某行在行末追加_linux shell 用sed命令在文本的行尾或行首添加字符
  5. 设置RDLC中table控件的表头在每页显示
  6. poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...
  7. 网络协议笔记-数据链路层
  8. 图书馆的uml概念类图怎么画_UML科普文,一篇文章掌握14种UML图
  9. Auto CAD指定线段长度和角度的方法
  10. 计算机图形学的未来前景,计算机图形学的发展前景
  11. 朴素贝叶斯0概率时不进行拉普拉斯平滑与进行了拉普拉斯平滑后正确率对比(德国信用卡案例)
  12. 好用的pdf阅读器(便携)
  13. sparkstream报错 Caused by: org.apache.spark.SparkException: This RDD lacks a SparkContext. It could ha
  14. 头歌-自己动手画CPU(第二关)-原码一位乘法器-Logisim
  15. Linxu-解压压缩命令
  16. leetcode 会员转让
  17. 【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵
  18. bind智能DNS + bindUI管理系统(postgresql + bind dlz)
  19. JAMon Introduction
  20. 多线程生产者消费者模型

热门文章

  1. 网络协议(一) TCP/IP 协议
  2. DTD语法 (元素、属性、实体声明)
  3. LeetCode-75. 颜色分类(荷兰国旗问题)
  4. 解释下ArrayList集合为啥允许值为null
  5. STM32显示图片,将图片转换为十六进制数组便捷工具
  6. “您未被授权查看该页,您不具备使用所提供的凭据查看该目录或页的权限” -- 解决办法
  7. 简述完整的计算机组成部分组成部分组成,简述计算机系统的组成
  8. nginx 屏蔽某些ip,防止有些人刷接口攻击
  9. J2me的基本概念(转)
  10. 沈阳农业大学计算机水平测试,沈阳农业大学(专业学位)计算机技术考研难吗