Mister-小方


私信TA

用户名:1104986125

访问量:127806

签 名:

如此英俊为哪般

等  级
排  名 6
经  验 20816
参赛次数 1
文章发表 68
年  龄 19
在职情况 学生
学  校 大连交通大学
专  业 车辆工程

  自我简介:

TA的其他文章

解题思路:
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 人评分

  评论区

lz你好 我n-m-1那个地方没能理解 能请你再详细说一下嘛
2018-08-29 17:15:57 | |
  • «
  • 1
  • »