linlinsong—ACM界蒟水!

拼命的向前跑,即使会栽倒!

哈理工OJ 1426 集训队的晚饭(DP)

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1426
集训队的晚饭
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 181(78 users) Total Accepted: 82(71 users) Rating: Special Judge: No
Description
集训队的晚饭经常是去校外吃盖饭的,一份10元,饭后结账。

结账时,同学们要排队按顺序结账,有n人拿的是20元,m人拿的是10元。但这时发现老板娘没有准备任何零钱,她只能靠收取同学们交的10元钱来找同学们交的20元,而且每个交20元的同学都要求立即找钱。

老板娘想知道到底有多少种不同的收钱顺序。(收相同的面值,不同的人被认为是一样的。例如第一个收A的10元或者B的10元是一样的。)

Input
输入包含多组测试数据。

对于每组测试数据:

第1行,包含两个正整数m, n (1 ≤ m, n ≤ 1000) 分别代表这拿10元钱的人数和拿20元的人数。

处理到文件结束

Output
对于每组测试数据:

第1行,输出老板娘有多少种不同的收钱顺序。(MOD 1000000007)

Sample Input
3 1

Sample Output
3

本题并不是太难,只要把状态转移方程想好就OK了。

第一个维度表示10块钱的个数,第二个维度表示20块钱的个数。20块钱的个数一定要小于等于10块钱的个数才可以找开零钱。
下面是AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MOD 1000000007
using namespace std;

int dp[1005][1005];
int main()
{
    memset(dp,0,sizeof(dp));
    for(int i=0; i<1002; i++)
    {
        dp[i][0]=1;
    }
    for(int i=1; i<=1002; i++)
    {
        for(int j=1; j<=i; j++)
        {
            dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;
        }
    }
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        printf("%d\n",dp[n][m]);
    }
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32866009/article/details/51541371
文章标签: 哈理工OJ
个人分类: 哈理工OJ dp
上一篇哈理工OJ 1559 线段相交(计算几何)
下一篇Codeforces Round #354 (Div. 2) A Nicholas and Permutation(水题)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭