原题链接:化学品问题
解题思路:
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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复