zstu深入浅出学算法020——DP——排队购票

Description

一常球赛开始前,售票工作正在进行中。每张球票为50元,现有k(1 <= k <= 30)人排队购票,其中n人手持50元的钱,剩余m人手持100元的钱,假设开始时售票处没有钱,求出售票处不出现找不开钱的不同排队种数(拿同样钞票面值的人换位置视为同一种排队)

Input

多组测试数据,先输入整数T表示组数,然后每组输入2个整数n和m

Output

对于每组测试数据输出1行,值为题目描述中的排队种数

Sample Input

2

1 2

1 1

Sample Output

0

1

HINT

 大意:DP是看两个状态之间的关系的不看整体,所以dp[i][j] = dp[i-1][j]是肯定满足的,如果n的数目大于等于m的话说明当前能找的开,dp[i][j] += dp[i][j-1];
#include<cstdio>

#include<cstring>

using namespace std;

int main()

{

    int T;

    scanf("%d",&T);

    while(T--){

        int dp[30][30];

        memset(dp,0,sizeof(dp));

        int n,m;

        scanf("%d%d",&n,&m);

        if( n < m){

            printf("0\n");

            continue;

        }

        for(int i = 0 ; i <= n ; i++){

            for(int j = 0; j <= m ; j++){

                if(i == 0) dp[i][j] = 0;

                else if( j == 0 && i !=0 ) dp[i][j] = 1;

                else   {

                  dp[i][j] = dp[i-1][j];

                  if( i >= j) dp[i][j] += dp[i][j-1];

                }



            }

        }

        printf("%d\n",dp[n][m]);

    }

    return 0;

}

                
View Code

 

你可能感兴趣的:(算法)