把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
对输入的每组数据M和N,用一行输出相应的K。
1 7 3
8
思路:
①当m < n 时,一定会空出来n-m个盘子,那么a[m][n] = a[m][m].
②当m >= n 时 , 又会分为两种情况:
1,没有盘子空下来,那么每个盘子放1个,然后剩余m-n个放在n个盘子里,即a[m][n] = a[m-n][n]
2,有一个盘子空下来,m个放n-1个盘子里,即a[m][n] = a[m][n-1]。
可能你会对这种情况有疑问,为什么只讨论有一个盘子空下来,这是为了保证有盘子空下来,m个苹果随便放在n-1个盘子里,肯定也会有别的盘子空出来。
两种情况加和即为结果。(ai][j]为i个苹果放j个盘子里的方案数)。
Code:
#include <iostream>
using namespace std;
const int AX = 15;
int a[AX][AX];
int main(){
int T;
cin >> T;
int m , n;
for( int i = 1 ; i <= 10 ; i++ ){
a[i][1] = 1;
a[1][i] = 1;
a[0][i] = 1;
}
for( int i = 2 ; i <= 10 ; i++ ){
for( int j = 2 ; j <= 10 ; j++ ){
if( i >= j ){
a[i][j] = a[i-j][j] + a[i][j-1];
}else a[i][j] = a[i][i];
}
}
while( T-- ){
cin >> m >> n ;
cout << a[m][n] << endl;
}
return 0 ;
}