http://acm.nyist.net/JudgeOnline/problem.php?pid=1076

 

方案数量

时间限制:65535 KB
难度:2
 
描述

nyoj1076-方案数量                【排列组合 dp】

给出一个N*M的棋盘,左下角坐标是(0,0),右上角坐标是(N,M),规定每次只能向上或者向右走,问从左下角走到右上角,一共有多少种方案。上图是一个4*3的棋盘。

 
输入
多组测试数据。
每组输入两个整数N,M(0≤N,M≤30)。
输入0,0时表示结束,不做任何处理。
输出
对于每组测试数据,输出对应的方案数。
样例输入
4 3
2 2
0 0
样例输出
35
6




解题思路A:ans = C(n+m, n)。因为从左下角走到右上角一共要走n+m步,往上要走n步,如果用1表示向上走,用0表示向右走,则相当于给n+m个数进行赋值,其中n个数被赋值为1,求有多少种赋值方法。只需从n+m个数里挑出n个,有C(n+m, n)中挑选办法。
代码:
 1  
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 #define ll long long
10 
11 ll Permutation(ll a,ll x);
12 
13 int main(){
14     ll m,n;
15     while(scanf("%lld %lld",&m,&n),m||n){
16         printf("%lld\n",Permutation(m+n,n));
17     }
18     return 0;
19 }
20 ll Permutation(ll a,ll x){
21     ll ans=1;
22     for(ll i=1;i<=x;i++)   ans=ans*(a-i+1)/i;
23     return ans;
24 }
25         
View Code

相关文章: