分苹果

题目:

穷举法:由于3 1 1和1 3 1 是一种分法,所以也就是说在N个篮子里的苹果数目是 n1<=n2<=......<=nn。所以只要进行N次循环,假设上层循环标量是i,则下层循环时j=i.

由于事先N,即篮子的数目是不确定的,所以只能使用递归来确定循环层数。

 1 #include<iostream>
 2 using namespace std;
 3 int count;
 4 int foo(int n,int m,int prei,int temp[10])
 5 {
 6     int i=0,j=0;
 7     if (n==0)
 8     {
 9         int sum=0;
10         for (j=1;j<10;j++)
11         {
12             sum+=temp[j];
13             cout<<temp[j]<<" ";
14         }
15         cout<<endl;
16         if(sum == m)
17         {
18             count++;
19         }
20         return 0;
21     }
22     for (i=prei;i<=m;i++)
23     {
24          temp[n]=i;
25          foo(n-1,m,i,temp);
26     }
27     return 0;
28 }
29 void main()
30 {
31     int temp[10]={0};
32     int m,n,i,sum=0;
33 
34     bool flag=false;
35     while(!flag)
36     {
37         cin>>m;
38         cin>>n;
39         if (m <=10 && n<=10)
40         {
41             flag = true;
42         }
43         else
44         {
45             cout<<"please m<=10 and n<=10"<<endl;
46         }
47     }
48     count=0;
49     foo(n,m,0,temp);
50     cout<<count<<endl;
51 }

Another solution for this problem from url:http://www.cnblogs.com/dongsheng/archive/2012/08/15/2640468.html

 1 /* 功能Function Description:     POJ-1664
 2    开发环境Environment:          DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                   可笑痴狂
 6    日期Date:                      20120815
 7    备注Notes:
 8    解题分析:
 9         设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,
10         当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(m,m)  
11         当n<=m:不同的放法可以分成两类:
12         1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);  
13         2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n).
14         而总的放苹果的放法数目等于两者的和,即 f(m,n) =f(m,n-1)+f(m-n,n) 
15     递归出口条件说明:
16         当n=1时,所有苹果都必须放在一个盘子里,所以返回1;
17         当没有苹果可放时,定义为1种放法;
18         递归的两条路,第一条n会逐渐减少,终会到达出口n==1; 
19         第二条m会逐渐减少,因为n>m时,我们会return f(m,m) 所以终会到达出口m==0.
20 */
21 #include<stdio.h>
22 
23 int fun(int m,int n)  //m个苹果放在n个盘子中共有几种方法
24 {
25     if(m==0||n==1)  //因为我们总是让m>=n来求解的,所以m-n>=0,所以让m=0时候结束,如果改为m=1,
26         return 1;    //则可能出现m-n=0的情况从而不能得到正确解    
27     if(n>m)
28         return fun(m,m);
29     else
30         return fun(m,n-1)+fun(m-n,n);
31 }
32 
33 int main()
34 {
35     int T,m,n;
36     scanf("%d",&T);
37     while(T--)
38     {
39         scanf("%d%d",&m,&n);
40         printf("%d
",fun(m,n));
41     }
42 }
原文地址:https://www.cnblogs.com/churi/p/3710570.html