[华为oj]放苹果

题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。<=n<=10<=m<=10

样例输入

7 3

样例输出

8

/**

* 计算放苹果方法数目

* 输入值非法时返回-1

* 1 <= m,n <= 10<><= m,n <= 10<>

* @param m 苹果数目

* @param n 盘子数目数

* @return 放置方法总数

*

*/

public static int count(int m, int n)

思路:

1.利用递归思想,假设已经得到后面一个盆子的摆放组合次数;

2.因为题目要的是组合,因此要把同样重复的组合去掉,有一种办法就是把盘子从左往右排一列,苹果的数量依次为降序,即可避免出现重复的情况,因此要有个判断。

3.结束条件要判断当前是否满足降序,满足即知道该组合成立,返回1;否则返回0.

 1 #include <iostream>
 2 using namespace std;
 3
 4 int count(int m,int n,int b)
 5 {
 6     //结束条件
 7     if(n==1)
 8     {
 9         if(m<=b)
10             return 1;
11         else
12             return 0;
13     }
14
15     //递归
16     int num=0;
17     for(int i=m;i>=0;i--)
18     {
19         if(i<=b)
20             num=num+count(m-i,n-1,i);
21     }
22     return num;
23 }
24
25 int main()
26 {
27     int m,n;
28     cin>>m>>n;
29     int num=count(m,n,m);
30     cout<<num<<endl;
31 }

在写该算法过程中,我开始的思路是先算出所有的排列次数,然后除掉重复的。但后来发现自己没找到如何去除重复的排列的方法。因为有些排列重复的次数和其它排列重复的次数不一样。下面是错误的算法。

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 int count(int m,int n)
 6 {
 7     if(n==1)
 8     {
 9         return 1;
10     }
11
12     int num=0;
13     for(int i=m;i>=0;i--)
14     {
15         num=num+count(m-i,n-1);
16     }
17     return num;
18 }
19
20 int mul(int n)
21 {
22 int result=1;
23 for(int i=n;i>=1;i--)
24 {
25     result=result*i;
26 }
27 return result;
28 }
29
30 int main()
31 {
32     int m,n;
33     cin>>m>>n;
34     int num=count(m,n);
35     num=num/mul(n);
36      cout<<num;
37 }
时间: 2024-10-11 12:53:35

[华为oj]放苹果的相关文章

oj放苹果

题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m<=10,1<=n<=10.<=n<=10<=m<=10 样例输入 7 3 样例输出 8 分析: 假设对于m个苹果,n个盘子共有apple(m,n)种方法,那么要想办法递归将m,n的值减小,首先设置递归条件,当m<=1或者n<=1时,apple(m,n)=1:

华为OJ:2041 放苹果

这道题难点不在于代码怎么写,而是思路怎么想.感觉一般这种题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做.有点像我们以前学的排列组合. 对于m个苹果,n个盘子f(m,n),如果苹果个数比盘子少,那么就跟n个盘子,n个苹果是一样的f(n,n).如果m比n大,那么有两种情况,一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数.第一种情况就即为n个盘子放在m-1个盘子里,因为至少有个空盘子.f(m,n-1),第二种情况下,

【华为OJ】【080-放苹果】

[华为OJ][算法总篇章] [华为OJ][080-放苹果] [工程下载] 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m<=10,1<=n<=10.<=n<=10<=m<=10 样例输入 7 3 样例输出 8 /** * 计算放苹果方法数目 * 输入值非法时返回-1 * 1 <= m,n <= 10<

放苹果

描述 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m<=10,1<=n<=10.<=n<=10<=m<=10 样例输入 7 3 样例输出 8 /** * 计算放苹果方法数目 * 输入值非法时返回-1 * 1 <= m,n <= 10<><= m,n <= 10<> * @

nyist oj 289 苹果 (动态规划——背包问题)

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

【递归】放苹果

问题 : [递归]放苹果 题目描述 楚继光刚把油拿到厨房,老妈又大声喊道:“快去把苹果洗了放到盘子里去.” 楚继光要把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5.1.1和1.5.1 是同一种分法. 输入 第1行为一个整数,表示测试数据的数目(测试数据的数目t(0 ≤ t ≤20),第2行为M和N(M和N,以空格分开.1≤M,N≤10). 输出 输出有多少种不同分法. 样例输入 1 7 3 样例输出 8 #include <iostream>

华为OJ:汽水瓶

题目有点像小学数学题,因为三个空瓶可以换一瓶汽水,但喝完一瓶汽水就可以得到一个空瓶.所以相当于两个空瓶就可以换到一瓶汽水. 把输入除以2即可.这里讲一下java多出入,可以用in.hasNext(),就相当于C/C++里面的while(scanf("%d",n)!=EOF). import java.util.Scanner; public class qishuiping { public static void main(String args[]){ Scanner input=

华为OJ:分段排序

题目有点绕,一个是要二分,用三个字符串,存前,中,后三个,前,后部分都降序排序,然后后半部分再反转一下,讲三部分合起来就好了. import java.util.Scanner; public class dividesort { public static void sort(StringBuffer s){ for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(s.charAt(i)>s.charAt(j))