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; }