oj 一简单的题目

来源:百度知道 编辑:UC知道 时间:2024/06/21 15:11:10
Problem Description
开学了,杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?

Input
数据的第一行包括一个正整数T,接下来有T组数据,每组数据占一行。
每组数据包含两个整数N(来报名的人数,1<=N<=30),M(节目需要的人数0<=M<=30)

Output
每组数据输出一个整数,每个输出占一行

Sample Input
5
3 2
5 3
4 4
3 6
8 0

Sample Output
3
10
1
0
1

我的:
#include<stdio.h>
void main()
{
int t,n,m,s1,s2,s,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n<m)
{ s=0;
printf("%d\n",s);
continue;
}
else if(m==0)
{
s=1;
printf("%d\n",s);
continue;
}
else
{
s1=1;
for(i=n;i>=n-m+1;i--)
s1*=i;
s2=1;
for(i=1;i<=m;i++)
s2*=

恩,楼上的程序提交了会TLE,把结果存以下就好了,这个是我写的:
#include <iostream>
using namespace std;
const int MAX = 31;
int result[MAX][MAX];
int c( int n, int m )
{
if (n<m) return 0;
if ( result[n][m] > 0 ) return result[n][m];
if ( m == 0 ) return result[n][m] = 1;
if ( n == m ) return result[n][m] = 1;
return result[n][m] = c( n-1, m )+ c( n-1, m-1 );
}
int main ()
{
int i,n,a,b;
cin>>n;
for ( i=0;i<n;i++ ) {
cin>>a>>b;
cout<<c( a,b )<<endl;
}
return 0;
}
提交过了,AC

杭州电子科技大学的acm题目丫。。。前几天的事了嘛,难道现在还在做?

//你的错误主要在
for(i=n;i>=n-m+1;i--)
s1*=i; 中当n=30,m=29(类似的两个都比较大且接近的数)时,s1会超过整型的范围,所以就出错了。这里我改成用递归来处理了
// 三楼的“利德“说得对,我的应该会tle。没有好好考虑,也没有hdu的号,所以就没有提交试试了。采用“利德“的方法就可以了,这里我就不改代码了。
#include<stdio.h>

int solve(int n,int m)
{
if(n<m) return 0;
if(m==0) return 1;
retur