题目
9284:盒子与小球之二
总时间限制: 10000ms 单个测试点时间限制:1000ms 内存限制:131072kB
描述
N个有差别的盒子(1<=N<=20)。你有A个红球和B个蓝球。0 <= A <= 15, 0 <= B <= 15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
输入
就一行,N,A,B,用空格分开
输出
就一行,输出放置方案总数
样例输入
2 1 1
样例输出
9
题目分析
本题一看上去就是典型的排列组合题目,于是我就试图写出该题目的核心公式,伴随着悦耳的键盘声,我的代码轻轻松松写好了!运行案例,bingo!提交代码,错误!没关系,一定是考虑不周,重新审视,哈哈,没关系,我重新做就是了(还生活以微笑!!!)。
挠着我日渐稀疏的头发,想着动态规划分小球,“思路清晰”的我打开了百度,搜索原题,小傻瓜,被我找到了吧,也并不复杂,先改成C语言,慢慢看,Em...,看不懂呢。
不不不,没有我排列组合放不了的小球,再想,成功!!!
数据结构
不需要不需要,int,long long玩遍排列组合!!!
代码及算法说明
排列组合失败版:
![3217fb78dfdc2c4122dfa4a78ed4fb87.png](https://i-blog.csdnimg.cn/blog_migrate/9eea2e4d7f49f0ee0e07fd71c7d65cd0.jpeg)
该代码中的排列组合公式(N+1)A+B/A!*B!由于个人的失误,少考虑了同色小球放在同一盘中情况的处理,导致提交错误,经过思考,认为该公式无法改进,因此放弃。
动态规划百度版:
![6497c9eaee892689ed068990ec6e3d1b.png](https://i-blog.csdnimg.cn/blog_migrate/2427ffdbfbfd8fae19c1dcf67e212d09.jpeg)
当放弃了排列组合后,我毫不犹豫地打开了百度搜索,动态规划不是我的水平所及,找到了该代码,说是隔板法,经过研读,并没有明白,毫无收获,也不对,我收获了重拾排列组合的信心,于是有了下面的代码。
排列组合辗压版:
![4fe98e7fe79af67ee3be481632841b85.png](https://i-blog.csdnimg.cn/blog_migrate/bf7ef5de53209c7b27ed1af798b7fbc5.jpeg)
看着晚自习的教室,内心喜悦万千,再痛苦挣扎了两个任务后,终于迎来了我的春天,这次的任务轻松结束,没有让我目及凌晨两点的信大,摸着我仅有的头发,开心的笑了。
算法分析
1. 本代码简洁明了,能省则省。
2. 运行时间稍长,没发现什么好的改进方法,可能是调用C时,第二个参数的选择问题,如果都选择N,可能会节省一点时间。
3. 数学推导在先,简化算法内容,实现相同功能。