合理放球
題目描述
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;
}