题目描述
有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置互换,也算是一种新的排法。(M<=10)
输入
输入一行,M,N,K(其中M=N+K,M<=10).
输出
输出一行,总的排队方案。
样例输入
4 2 2
样例输出
8
Java:
import java.util.Scanner;
public class Main {
public static Scanner sca=new Scanner(System.in);
public static void main(String[] args) {
int m=sca.nextInt();
int n=sca.nextInt();
int k=sca.nextInt();
if(n<k){
System.out.println(0);
}else{
int s1=1,s2=1;
for(int i=1;i<=k;i++){
s1*=i;
}
for(int i=1;i<=n;i++){
s2*=i;
}
int[][] dp=new int[20][20];
dp[1][0]=1;
dp[1][1]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<=i;j++){
for(int t=0;t<=j;t++){
dp[i][j]=dp[i][j]+dp[i-1][t];
}
}
}
System.out.println(dp[n][k]*s2*s1);
}
}
}
c语言:
#include <stdio.h>
#define N 10
int main()
{
int z,x,y,i,j,o;
int pl(int x);
while(scanf("%d%d%d",&z,&x,&y)!=EOF)
{
int v[20][20]={0};
if(y>x){
printf("0\n");
}else{
v[1][0]=1;
v[1][1]=1;
for(i=2;i<=x;i++){
for(j=0;j<=i;j++){
for(o=0;o<=j;o++){
v[i][j]=v[i][j]+v[i-1][o];
}
}
}
printf("%d\n",v[x][y]*pl(x)*pl(y));
}
}
return 0;
}
int pl(int x){
int i,e=1;
for(i=1;i<=x;i++){
e=e*i;
}
return e;
}
c++:
#include<stdio.h>
int canExchange(int M, int N, int K, int change)
{
if( K == 0)
return 1;
if( N+change < K)
return 0;
if(N != 0){
if(change ==0 ){
return canExchange(M-1,N-1,K,1);
}else{
return canExchange(M-1,N-1,K,change+1) + canExchange(M-1,N,K-1,change-1);
}
}else{
return canExchange(M-1,N,K-1,change-1);
}
}
int main()
{
int M,N,K;
scanf("%d %d %d",&M, &N, &K);
int sum = 0;
sum = canExchange(M,N,K,0);
if(sum == 0)
printf("0\n");
else{
for(int i=1; i<= N; i++)
sum*=i;
for(int j=1; j<= K; j++)
sum*=j;
printf("%d\n",sum);
}
return 0;
}