Poj1664 放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output

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 ;
}

猜你喜欢

转载自blog.csdn.net/frankax/article/details/80207898