放苹果
题目描述: 把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 这题貌似用dfs做的,但我想不到。。发现能用动规做,例如,d[1][n]对于任意1<=n<=10都有d[1][n] = 1,一个盘子当然只有一种摆法。 d[2][n] = n / 2 + 1,因为1,5和5,1是同一种摆法,所以要除个2,然后由于有(0, n)这种摆法,所以要+1。 而当盘子数大于2时,就有递推公式了,见AC代码。 #include <cstdio> #include <cstring> int main() { int a[15][15]; for (int i = 1; i <= 10; ++i) for (int j = 0; j <= 10; ++j) { //当j等于0时,相当于0个苹果放进i个盘子有多少摆法,为了用动规,我定义a[i][0] = 1。 if(!j) a[i][j] = 1; else if(i == 1) a[i][j] = 1;