解题思路:
1.分情况来讨论n<m,n=m,n>m
2.n<m,随便放吧2的n次方
3.当n=m,有2的n次方减一种方法,只要不是全部都是药品就行
4.当n>m的情况,这时候可以通过N-1的方案数和N-M-1的方案数推出N的方案数。由N-1变成N可以在N-1个试管后放一个试管, 因为试管有放药品和不放药品两个选择,所以是2*N-1的方案数,若是试管装药品可能会爆炸,需要将错误的方案数剔除,而不合题意只能是第N个试管的前面M-1个试管都放药品,第前M个不放药品。所以不合要求的为N-M-1试管放药品合题意的方案数。
参考代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> int f(int n, int m, int t[33][6]) { if(t[n][m]) return t[n][m]; if(n<m) { t[n][m]=pow(2,n); //n<m,随便放吧2的n次方 return t[n][m]; } if(n==m) //当n=m的时候 { t[n][m]=pow(2,n)-1; //有2的n次方减一种方法,只要不是全部都是药品就行 return t[n][m]; } t[n][m]=f(n-1,m,t)+f(n-1,m,t)-f(n-1-m,m,t); //这里就是当n>m的情况,这时候可以通过N-1的方案数和N-M-1 //的方案数推出N的方案数。由N-1变成N可以在N-1个试管后放一个试管, 因为试管有放药品和不放药品两个选择,所以是 //2*N-1的方案数,若是试管装药品可能会爆炸,需要将错误的方案数剔除,而不合题意只能是第N个试管的前面M-1个试管 //都放药品,第前M个不放药品。所以不合要求的为N-M-1试管放药品合题意的方案数。 return t[n][m]; } int main() { int t,n,m; scanf("%d", &t); while(t--) { int t[33][6]= {0}; scanf("%d %d", &n, &m); printf("%d\n", f(n, m, t)); } return 0; }
看看大家还有什么不懂的,请在下方评论区留言
0.0分
6 人评分
【明明的随机数】 (C++代码)浏览:834 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:573 |
DNA (C语言描述,数据结构)浏览:909 |
1118(求助_已解决)浏览:351 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:721 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1495 |
C二级辅导-温度转换 (C语言代码)浏览:802 |
JAM计数法 (C语言代码)浏览:721 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1359 |
【魔板】 (C++代码)浏览:1235 |