暴力放苹果

放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 27339   Accepted: 17355

Description

把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



 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <string.h>
 6 using namespace std;
 7 typedef long long ll;
 8 int n,m,cou,a[100];
 9 void dfs(int k,int nn,int mm)///解法1
10 {
11     //printf("%d--",cou);
12     if(mm>m) return ;
13     if(nn==0)
14     {
15         if(mm<=m)
16         {
17             cou++;
18         }
19         return;
20     }
21     for(int i=k; i<=nn; i++)///第i个数不小于第i-1个数,这样不会造成重复。
22     {///如果是从1一直到nn,那么就会生成所有的排列情况,会有重复。
23         dfs(i,nn-i,mm+1);
24     }
25 }
26 int f(int nn,int mm)///解法2
27 {///整数划分
28     ///所谓n关于m的划分,就是n分成任意个非负数部分,但是每一个部分都不超过m
29     ///两种情况: 1 至少存在一个m,相当与n-m后再进行m的划分。
30     ///          2  不存在m,也就是n关于转化成m-1的划分。
31     if(nn<0) return 0;
32     if(nn==1||mm==1) return 1;
33     return f(nn-mm,mm)+f(nn,mm-1);
34 }
35 int main()
36 {
37     int t;
38     scanf("%d",&t);
39     while(t--)
40     {
41         scanf("%d%d",&n,&m);
42         /*{cou=0;
43         dfs(1,n,0);
44         printf("%d
",cou);}*/
45             printf("%d
",f(n,m));
46     }
47     return 0;
48 }
View Code
原文地址:https://www.cnblogs.com/linxhsy/p/4453635.html