poj2249 2010.2.8
#include <stdio.h>
#include <string.h>
int cm(int,int);
int cm(int n,int m)
{
// printf("%d %d\n",n,m);
if ((m==0)||(n==m)) return 1;
if (m==1) return n;
return (cm(n-1,m)+cm(n-1,m-1));
}
void main()
{
int n1,m1;
while (scanf("%d %d",&n1,&m1),n1)
printf("%d\n",cm(n1,m1));
}
记忆化
#include <stdio.h>
long long result[200][200];
long long c (long long m, long long n) {
long long s;
if (m < 200 && n < 200 && result[m][n]) return result[m][n];
if (n == 0 || n == m) s = 1;
else if (n == 1 || n == m - 1) s = m;
else if (n > m - n) s = c (m, m - n);
else s = m * c (m - 1, n - 1) / n;
if (m < 200 && n < 200) result[m][n] = s;
return s;
}
int main ()
{
long long m, n;
while (scanf ("%lld %lld", &m, &n) && (m || n)) {
printf ("%lld\n", c (m, n));
}
return 0;
}