合理放球題解

合理放球


題目描述
n個各不相同球放入m個相同的盒子裏,球全部放完後,要求最後沒有空盒!求 不同的放法總數。
輸入格式
一行兩個數n和m
n表示球數,m表示盒子數
輸出格式
不同且合理的放法總數
樣例
樣例輸入
3 2
樣例輸出
3
數據範圍與提示
(0<n≤20)(0≤m≤20)


精髓:這道題有兩種情況:

1.當最後一個球獨佔一個盒子時,說明其餘n-1個球要放進其餘m-1個盒子中(a[i-1][j-1])。

2.當最後一個球和其餘若干球共佔一個盒子時,說明其餘n-1球要放進m個盒子中,此時,最後一個球,可以放進任意一個盒子裏(a[i][j-1]*i)。

把兩者相加,就得到了遞推式:a[i][j]=a[i-1][j-1]+a[i][j-1]*i;

參考代碼:

#include<cstdio>
int main() {
	int n,m;
	long long a[25][25]={};
	scanf("%d %d",&n,&m);
	for(int i=1;i<=24;i++) { //初始化分兩種情況
		a[1][i]=1;//1.當盒子只有一個時,所有球只能都放在這一個裏面,所以只有一種情況。
		a[i][i]=1;//2.當盒子數量與球數量相等時,因爲題目要求不能讓盒子空着,所以只有每個盒子放一個球這一種情況。
	}
	for(int i=2;i<=m;i++) {
		for(int j=i+1;j<=n;j++) {
			a[i][j]=a[i-1][j-1]+a[i][j-1]*i;
		}
	}
	printf("%lld",a[m][n]);
	return 0;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章