排列组合问题求算法

fuzeqiang 2013-10-21 11:50:57
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。0<=m<=10,1<=n<=10
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜡笔小瑤 2013-10-22
  • 打赏
  • 举报
回复
引用 7 楼 huxiweng 的回复:
思路: ①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放 ②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个

import java.util.Scanner;

public class MNAppleTest {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		int N, M; // M Apple, N Disk
		M = in.nextInt();
		N = in.nextInt();
		System.out.print("共有"+cal(M, N)+"种结果");
	}

	private static int cal(int m, int n) {
		if (m < 0)
			return 0;
		if (m == 0 || n == 1)
			return 1;
		return cal(m - n, n) + cal(m, n - 1);

	}

}

唉,看来我得好好研究下递归了!
teemai 2013-10-22
  • 打赏
  • 举报
回复
思路: ①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放 ②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个

import java.util.Scanner;

public class MNAppleTest {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		int N, M; // M Apple, N Disk
		M = in.nextInt();
		N = in.nextInt();
		System.out.print("共有"+cal(M, N)+"种结果");
	}

	private static int cal(int m, int n) {
		if (m < 0)
			return 0;
		if (m == 0 || n == 1)
			return 1;
		return cal(m - n, n) + cal(m, n - 1);

	}

}

失落夏天 2013-10-22
  • 打赏
  • 举报
回复
引用 5 楼 andylau_zhl 的回复:
[quote=引用 2 楼 AA5279AA 的回复:] 至于你这个问题, 参照我博客中的 http://blog.csdn.net/rzleilei/article/details/10461653 吧,几乎是一模一样的,从M个中选出N个,无序
貌似不适用,你可以试试,不符合LZ要求[/quote] 我说的几乎一摸一样并不是完全一样 这题就是简单的for循环+排除的话那就有点可悲了,比如我说一种 构建List存储所有可能 List<String> for(遍历a的可能,0到10){ for(遍历b的可能,0到10-a){ for(遍历c的可能,0到10-a-b){ //这里就是一个排除的功能,都建对象,把最大的那个数放到第一位里,最小的放到最后面,然后把这数字构建成字符串,String,判断List中是否有,如果没有添加进去就行了。 } } } //最后统计List长度就ok了。 我想说的和我那个例子有极大相似性,是想说能否阻断式的去计算,而不是用这种遍历了所有可能后的排除。
蜡笔小瑤 2013-10-22
  • 打赏
  • 举报
回复
引用 2 楼 AA5279AA 的回复:
至于你这个问题, 参照我博客中的 http://blog.csdn.net/rzleilei/article/details/10461653 吧,几乎是一模一样的,从M个中选出N个,无序
貌似不适用,你可以试试,不符合LZ要求
qq_wwwhj 2013-10-22
  • 打赏
  • 举报
回复
引用 7 楼 huxiweng 的回复:
思路: ①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放 ②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个

import java.util.Scanner;

public class MNAppleTest {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		int N, M; // M Apple, N Disk
		M = in.nextInt();
		N = in.nextInt();
		System.out.print("共有"+cal(M, N)+"种结果");
	}

	private static int cal(int m, int n) {
		if (m < 0)
			return 0;
		if (m == 0 || n == 1)
			return 1;
		return cal(m - n, n) + cal(m, n - 1);

	}

}

这样题关键是思路对头,思路正确,代码就很简单
zqfddqr 2013-10-22
  • 打赏
  • 举报
回复
排列组合通用算法 以前写的 http://blog.csdn.net/zqfddqr/article/details/8574339
fuzeqiang 2013-10-22
  • 打赏
  • 举报
回复
引用 7 楼 huxiweng 的回复:
思路: ①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放 ②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个

import java.util.Scanner;

public class MNAppleTest {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		int N, M; // M Apple, N Disk
		M = in.nextInt();
		N = in.nextInt();
		System.out.print("共有"+cal(M, N)+"种结果");
	}

	private static int cal(int m, int n) {
		if (m < 0)
			return 0;
		if (m == 0 || n == 1)
			return 1;
		return cal(m - n, n) + cal(m, n - 1);

	}

}

谢谢,版主的代码很精炼!把想法抽象成代码还真不是一件容易的事情。
失落夏天 2013-10-21
  • 打赏
  • 举报
回复
至于你这个问题, 参照我博客中的 http://blog.csdn.net/rzleilei/article/details/10461653 吧,几乎是一模一样的,从M个中选出N个,无序
fuzeqiang 2013-10-21
  • 打赏
  • 举报
回复
来人回答下嘛
fuzeqiang 2013-10-21
  • 打赏
  • 举报
回复
引用 3 楼 海龙 的回复:
for + if
拿你的算法出来看看,不然我会以为你在瞎扯的。
我的波塞冬 2013-10-21
  • 打赏
  • 举报
回复
for + if

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧