样例输入

5 5

6 1

样例输出

7

1

说明:

对于输入5 5,有7种放法,分别是

(1) 5个小球都放在一个盒子里,剩下4个盒子都是空的;

(2) 4个小球放在一个盒子里,1个小球放在一个盒子里,剩下3个盒子是空的;

(3) 3个小球放在一个盒子里,2个小球放在一个盒子里,剩下3个盒子是空的;

(4) 3个小球放在一个盒子里,1个小球放在一个盒子里,1个小球放在一个盒子里,剩下2个盒子是空的;

(5) 2个小球放在一个盒子里,2个小球放在一个盒子里,1个小球放在一个盒子里,剩下2个盒子是空的;

(6) 2个小球放在一个盒子里,1个小球放在一个盒子里,1个小球放在一个盒子里,1个小球放在一个盒子里,剩下1个盒子是空的;

(7) 5个盒子每个盒子里放一个小球。

对于输入6 1,有1种方法。

小球和盒子问题的思路网上有很详细的讲解,下边推荐两个链接
https://www.zhihu.com/question/21731092
https://blog.csdn.net/zwz_511/article/details/46240927
这两个链接里就有正确的答案,只修要稍微修改一下,将只能接收一组数据改为接收多组数据就好了,这个部分是这个题的难点
  注意:题目中只是说允许多行输入但是并没有给出输入的结束条件,所以我的第一反应是当下一次输入为空也就是只有一个回车换行而没有数据时,输入结束,但写完提交全错以后打开反馈的测试数据发现每一组数据最后的两组数是完全一致的,所以,只能重新修改逻辑去匹配它的结束条件。
  
满分通过的代码

#include <stdio.h>
#include<malloc.h>int f(int n, int m)
{if(m == 1 || n == 0) return 1;if(m > n) return f(n, n);return f(n, m-1) + f(n-m, m);
}int main() {int a,b,j,result;//a,b分别是题目中的n,m;j是下边for循环的循环标志,result是最后的结果 int a1 = 0;int b1 = 0;//通过a1,b1是否与上一组a,b值相等来控制输入的结束(这个只能通过测试用例分析出来,差点坑死) int* store;//用来暂存所有的输入 int i = 0;//标记总共有多少个数据,2个一组 store = (int*)malloc(sizeof(int));scanf("%d %d",&a,&b);*(store+i) = a; i++;*(store+i) = b; i++;while((a==a1)?((b==b1)?0:1):1){//a!=a1 && b!=b1判断是错的 a1 = a;b1 = b;scanf("%d %d",&a,&b);*(store+i) = a; i++;*(store+i) = b; i++;}for(j=0;j<i-2;){a = *(store+j);j++;b = *(store+j);j++;result = f(a,b);printf("%d\n",result);}return 0;
}

  下边java和C的代码是,当最初按自己的想法写的控制多行输入的代码,一起粘一下,测试的输出语句都没删,C写的有点复杂
C:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
//自己电脑环境里能够正常运行,提交报错,唯一区别是傻的在输入结束条件上下了很大功夫关键还是错的
int f(int n, int m)
{if(m == 1 || n == 0) return 1;if(m > n) return f(n, n);return f(n, m-1) + f(n-m, m);
}int main(){int i = 0;int j,n,m,result;char cn,cm;char** p;char* p1;char* p2;p = (char**) malloc(sizeof(char*));p1 = (char*) malloc(sizeof(char));p2 = (char*) malloc(sizeof(char));gets(p1);//gets能够获取的空格,scanf的话碰到空格就是分割符 *(p+i) = p1;//printf("*(p+%d)%s\n",i,*(p+i));//printf("%s\n",p1);while(strlen(p1)){i++;p1 = (char*) malloc(sizeof(char));gets(p1);//gets能够获取的空格,scanf的话碰到空格就是分割符 *(p+i)= p1;//printf("*(p+%d)%s\n",i,*(p+i));//printf("%s\n",p1);} //printf("i=%d\n",i);//printf("*(p+0)%s\n",*(p+0));for(j=0;j<i;j++){p2 = *(p+j);//printf("p2=%s\n",p2);//printf("strlen(p2)=%d\n",strlen(p2));//printf("*(p2+0)=%c\n",*(p2+0));//printf("*(p2+1)=%c\n",*(p2+1));//printf("*(p2+2)=%c\n",*(p2+2));n = (int)*(p2+0) - 48; //转换成对应的整形数字 //printf("n=%d\n",n);m = (int)*(p2+2) - 48;//转换成对应的整形数字//printf("m=%d\n",m);result = f(n,m);printf("%d\n",result);}return 0;
}

java:

import java.util.Scanner;public class Boxs {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer sb = new StringBuffer();Scanner in = new Scanner(System.in);String s = in.nextLine();sb.append(s);while (s.length() != 0) {s = in.nextLine();// 只有回车换行也算是有字符,能够获取到sb.append(" " + s);}String input = sb.toString();String[] divide = input.split(" ");int len = divide.length;for (int i = 0; i < len;) {int n, m;n = Integer.parseInt(divide[i]);i++;m = Integer.parseInt(divide[i]);i++;System.out.println(f(n, m));}}static int f(int n, int m) {if (m == 1 || n == 0)return 1;if (m > n)return f(n, n);return f(n, m - 1) + f(n - m, m);}}

离散数学:n个相同的小球,可以放入m个相同的盒子里,允许有空盒,问有多少种不同方法相关推荐

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

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

  2. 4个不同的小球放入3个不同的盒子中(盒子不允许为空),一共有______种不同的放法

    由题意知四个不同的小球全部随意放入三个不同的盒子中,则必须有1个盒子里放2个球,其余的三个盒子各放1个, 首先要从4个球中选2个作为一个元素,有C42种结果, 同其他的两个元素在三个位置全排列有A33 ...

  3. 云枢子表里放入富文本,富文本里放a标签,点击无法触发事件问题

    现象如下图: 想要达到的效果: 同样的是长文本的富文本控件,只有下面这种情况才可以点击触发a标签的事件. 排查了一段时候后发现,这个显示的样式是根据流程数据项权限来控制的.由于上面那个控件是我新添加的 ...

  4. n个小球放入m个盒子中_M个球放入N个盒子的放法

    M个球放入N个盒子的放法 1.N个盒子编号为1到N, 把M个相同的球放入这N个不相同的盒子,问共有多少种放法. M个球分成了N组,即装入N个盒子.如果要求每个盒子至少有一个球,则要求M>=N. ...

  5. [概率练习]n个小球放入m个盒子

    球可以相同也可以不同,盒子可以一样也可以不一样,盒子可以空也可以不能空,那么一共就有2*2*2=8种 n个小球放入m个盒子 1.球同,盒不同,不能空 用插板法 一共有n-1个空隙(总共n+1个空隙,不 ...

  6. [ACM] POJ 1664 放苹果(n个相同小球放入m个相同盒子)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25952   Accepted: 16509 Description ...

  7. 8个球放入3个盒子方式_球放进盒子问题(8种, 可变形)

    http://blog.sina.com.cn/s/blog_3f2c3d220100d57q.html 假设有m个小球,放入n个盒子里(),有几种放法? (1)盒子不同,球不同,允许有空. 由于每个 ...

  8. 排列组合 n个球放入m个盒子问题 总结

    算法: HDU - 6397 Character Encoding 插板法+容斥原理  https://blog.csdn.net/xiang_6/article/details/81868989 [ ...

  9. 排列组合 n个球放入m个盒子算法 总结

    问题: 总结   https://blog.csdn.net/qwb492859377/article/details/50654627 N个球放M个盒子问题   https://blog.csdn. ...

  10. 将n个相同小球放入m个不同盒子内的放法种数

    现在有10个球,要放进3个盒子里 ●●●●●●●●●● 隔2个板子,把10个球被隔开成3个部份 ●|●|●●●●●●●●.●|●●|●●●●●●●.●|●●●|●●●●●●.●|●●●●|●●●●●. ...

最新文章

  1. 25、HTML 文本格式化
  2. nuxt2中使用less
  3. Black White(尺取)
  4. URAL1815 Farm in San Andreas(费马点,圆圆相交)
  5. 实录:oracle下大表清理整改
  6. vue项目没有router文件夹_Vue路由(vue-router)配置实战——动态路由,重定向,工程非根目录...
  7. sqlite创建表格
  8. 八仙过海,四种同步(Java中的四种同步类)
  9. 黑马程序员培训没兄弟会高级
  10. 智能优化算法:秃鹰搜索算法 -附代码
  11. 【C#】ADO.NET 实体数据模型 warning CS1591:
  12. 人工智能数学基础---定积分4:使用换元法计算定积分
  13. 祭奠逝者一支香,丧钟为所有生者而鸣
  14. yield 和 yield*
  15. linux设置全局代理
  16. stm32ad测量范围_用STM32的AD测电压,范围是0~3.3V,但是输入电压可能高于3.3,怎么保护STM32?...
  17. MSSQLSERVER 与 SqlExpress
  18. MindMaster---总结案例
  19. 微信运营,做好微信朋友圈营销的6个技巧和3点注意事项
  20. ZUU中优动态人脸门禁机硬件操作说明书/ 中优ZU-8650、ZU-8657、ZU-8643操作说明书/中优刷脸门禁使用教程使用说明书

热门文章

  1. 计算机为什么硬盘值钱,数据到底有多值钱?看完硬盘数据恢复价格你就知道了...
  2. linux中怎样隐藏文件,Linux下如何隐藏文件
  3. 如何在网页上添加分享按钮
  4. centos7.x配置mysql初始密码
  5. neo4j 初始密码
  6. linux服务器使用WonderShaper进行带宽限制
  7. python假分数约分_数学中假分数怎么约分
  8. css 标点符号换行问题
  9. 常用网络命令:ping命令的使用
  10. Re-parameterizing Your Optimizers rather than Architectures