将m个相同的球全部放到n个相同的盒子里面有几种放法,盒子不能为空
将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个相同的盒子里面有几种放法,盒子不能为空相关推荐
- n个相同的球放入m个相同的盒子
在复习组合数学的时候,遇到这样一个问题: n个相同的球放入m个相同的盒子里,在可以有空盒和没有空盒的情况下,各有多少种方法? n个相同的球放入m个相同的盒子,先考虑可以存在空盒的情况. 可以这样思考: ...
- 5个球放入3个箱子_排列组合问题,把5个相同的球放到三个相同的盒子里,要求每个盒子都有球,则不同的放球方法是多少?...
一个一个的列出来就好了. 2种.311和221 ----............... 修改. 这本来就是从一个一个列举出来的.要用到排列组合的都是一些特定的情况.不过这道题貌似用不上. 比如5个球变 ...
- 算法题放苹果:把M个相同的苹果放到N个完全相同的盘子里,有多少种放法?
文章目录 题目描述 题解 思路1 暴力递归 思路2:缓存思想--动态规划来优化暴力递归 题目描述 链接:点我做题 题解 思路1 暴力递归 我们利用递归来解决这个问题,不妨这样思考,假设apples ...
- NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(二)
一.计算机基础部分 bios bios_百度百科 如果某个进制下7*7=41等式成立,那12*12=? 如果某个进制下7*7=41等式成立,那12*12=?_百度知道 计算机加电后操作系统启动过程 计 ...
- 浅谈n个球和m个盒子之间的乱伦关系
无视标题,从我做起 update in 2018.10.1: 补充了"至多为1的四中情况" 这玩意儿的官方名字应该是叫"Twelvefold way",共用12 ...
- 算法题(模板)——N个球放入M个盒子中
题目:n个球放入m个盒子中,有多少种放法 情况一:球同,盒不同,无空盒 也就是所有球都是一样的,但是盒子有区别,且不能出现空放的情况. 采用插板法,相当于在n-1个空隙中,插入m个盒子,而由于不能有空 ...
- SDNU 1011.盒子与球(斯特林函数)
Description 现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子.则有多少种放法? Input n, r(0 <= n, r <= 10). ...
- SDNU 1011.盒子与球
SDNU 1011.盒子与球 Time Limit: 1000 MS Memory Limit: 32768 KB Total Submission(s): 885 Accepted Submissi ...
- AlvinZH双掉坑里了
AlvinZH双掉坑里了 时间限制: 1000 ms 内存限制: 65536 kb 题目描述 AlvinZH双掉进坑里了! 幸运的是,这坑竟然是宝藏迷宫的入口.这一次AlvinZH机智地带了很多很多背 ...
- 排列组合之插板法及变形
主要用于"相同元素"分到"不同容器"的排列组合. [例1] 共有10本相同的书分到7个班里,每个班至少要分到一本书,问有几种不同分法? [解析]注意,这里面有个 ...
最新文章
- GridView 72 般绝技
- hdu5399(找规律。。。)
- 使用jqprint插件完成页面打印
- sed搜索某行在行末追加_linux shell 用sed命令在文本的行尾或行首添加字符
- 设置RDLC中table控件的表头在每页显示
- poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...
- 网络协议笔记-数据链路层
- 图书馆的uml概念类图怎么画_UML科普文,一篇文章掌握14种UML图
- Auto CAD指定线段长度和角度的方法
- 计算机图形学的未来前景,计算机图形学的发展前景
- 朴素贝叶斯0概率时不进行拉普拉斯平滑与进行了拉普拉斯平滑后正确率对比(德国信用卡案例)
- 好用的pdf阅读器(便携)
- sparkstream报错 Caused by: org.apache.spark.SparkException: This RDD lacks a SparkContext. It could ha
- 头歌-自己动手画CPU(第二关)-原码一位乘法器-Logisim
- Linxu-解压压缩命令
- leetcode 会员转让
- 【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵
- bind智能DNS + bindUI管理系统(postgresql + bind dlz)
- JAMon Introduction
- 多线程生产者消费者模型
热门文章
- 网络协议(一) TCP/IP 协议
- DTD语法 (元素、属性、实体声明)
- LeetCode-75. 颜色分类(荷兰国旗问题)
- 解释下ArrayList集合为啥允许值为null
- STM32显示图片,将图片转换为十六进制数组便捷工具
- “您未被授权查看该页,您不具备使用所提供的凭据查看该目录或页的权限” -- 解决办法
- 简述完整的计算机组成部分组成部分组成,简述计算机系统的组成
- nginx 屏蔽某些ip,防止有些人刷接口攻击
- J2me的基本概念(转)
- 沈阳农业大学计算机水平测试,沈阳农业大学(专业学位)计算机技术考研难吗