题目描述
一个实验室有N个放化学品的试管,排列在一条直线上。如果连续M个试管中放入药品,则会发生爆炸,于是,在某些试管中可能不放药品。
任务:对于给定的N和M,求不发生爆炸的放置药品的方案总数
输入
第一行是一个正整数L,代表输入数据的组数
接下来L行,每行有两个正整数N,M( 1<N<32,2≤M≤5)
输出
输出L行,每行只有一个正整数S,表示对应输入数据的方案总数。
样例输入
2 4 3 3 2
样例输出
13 5
#include<iostream>
#include<cmath>
using namespace std;
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);
return t[n][m];
}
if(n==m)
{
t[n][m]=pow(2,n)-1;
return t[n][m];
}
t[n][m]=f(n-1,m,t)+f(n-1,m,t)-f(n-1-m,m,t);
return t[n][m];
}
int main()
{
int a,n,m;
cin>>a;
while(a)
{
int t[33][6]={0};
cin>>n>>m;
cout<<f(n,m,t)<<endl;
a--;
}
return 0;
}