1 0

求一个排列组合的算法,我想了好久没想出来。。10

输入数据是这样这的,有N组数字(N不确定),每组中数字的个数也不确定。
例如
A (1,2,3,4,5)
B(2,3,4,5,6)
C(9,0,9,9,0,6,5)
D(5,6,3,6,8)
......

要求是从每组数字中取出一个数字,然后相乘。所有乘起来的结果再相加。
例如,从A中取出1,B中取出2,C中取出5,D中取出5, 1*2*5*5=50
然后从A中取出1,B中取出2,C中取出5,D中取出8   ,1*2*5*8=80
.。。。。。
然后全部加起来。

其实乘积这些都不重要,关键是,需要相乘得那几个数字怎么获取到组合。
目前有想法是用多叉树去做。不过实现不太会写,求源码。最好是java的
2012年12月24日 14:19

4个答案 按时间排序 按投票排序

1 0

取数的过程就是求这些集合的笛卡尔积吧。

google的guava库里的Sets有现成的求笛卡尔积方法(Sets.cartesianProduct) ,参考 http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/index.html

你有兴趣可以把源码下载下来看看是怎么实现的。不过由于你题目里某些组有重复数字,不能直接用这些数字组成Set,而应该先用下标值来算,比如
A (0,1,2,3,4)
B (0,1,2,3,4)
C (0,1,2,3,4,5,6)
D (0,1,2,3,4)
...
求出一个组合后再通过下标来取数。

2012年12月24日 20:03
0 0

不想直接用集合的话,就只能用下标来算了。给你写个简单的迭代器吧

import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 一个用于获取多个数组下标的笛卡尔积的迭代器。构造此迭代器时,指定各个数组的下标上限。
 * 此迭代器每次迭代将获取这些数组下标的笛卡尔积集合中的下一个元素
 *
 * @author Daniel
 *         Date: 25/12/12
 *         Time: 9:25 PM
 */
public class IndexCartesianProductIterator implements Iterator<int[]>
{
	private int[] elementSizes;
	private int[] next;
	private boolean calculated;
	private boolean hasNext;

	final int length;
	int tail;

	/**
	 * 构造一个{@link IndexCartesianProductIterator}实例
	 *
	 * @param elementSizes 待求笛卡尔积的各个数组的下标上限
	 */
	public IndexCartesianProductIterator(int... elementSizes)
	{
		this.elementSizes = elementSizes;
		length = elementSizes.length;
		next = new int[length];
		Arrays.fill(next, -1);
		calculated = false;
		tail = 0;
	}

	@Override
	public boolean hasNext()
	{
		if (calculated) return hasNext;
		calculated = true;
		hasNext = findNext();
		return hasNext;
	}

	@Override
	public int[] next()
	{
		if (calculated)
		{
			if (hasNext)
			{
				calculated = false;
				return next;
			} else throw new NoSuchElementException();
		} else
		{
			hasNext = findNext();
			if (hasNext) return next;
			else throw new NoSuchElementException();
		}
	}

	/**
	 * 计算下一个笛卡尔积元素,存放在next数组中。若该元素存在则返回true,否则返回false
	 *
	 * @return 若存在下一个笛卡尔积元素,则返回ture,否则返回false
	 */
	protected boolean findNext()
	{
		for(;;) {
			next[tail]++;
			if (next[tail] >= elementSizes[tail]) {
				tail--;
				if (tail < 0) return false;
			}
			else if (tail < length - 1) next[++tail] = -1;
			else return true;
		}
	}

	@Override
	public void remove()
	{
		throw new UnsupportedOperationException();
	}

	public static void main(String[] args)
	{
		for (IndexCartesianProductIterator it = new IndexCartesianProductIterator(3, 2, 4); it.hasNext(); )
		{
			System.out.println(Arrays.toString(it.next()));
		}
	}
}


其中的main方法是简单的测试代码,你可以去掉。

2012年12月25日 19:21
0 0

应该用递归写吧

2012年12月25日 10:25
0 0

过了问答比赛时期,大家都没有热情了。
其实不复杂,自己先好好想想!

2012年12月24日 15:44

相关推荐

    基于c语言排列组合算法

    基于C语言排列组合算法 排列组合是计算机科学中一个重要的概念,它广泛应用于数学、统计学、计算机科学等领域。排列组合问题的算法设计是指如何高效地生成所有可能的排列或组合。今天,我们将讨论基于C语言的排列...

    C#实现排列组合算法完整实例

    在C#编程中,排列组合算法是解决许多数学和计算机科学问题的基础,特别是在处理数据排序、统计计算以及算法设计时。本实例详细介绍了如何利用C#实现这两种基本的算法:排列(Permutation)和组合(Combination)。...

    PHP实现多种类型的排列组合算法

    在编程领域,排列组合算法是解决许多问题的关键,特别是在数据处理、数据分析以及各种优化问题中。PHP作为一种流行的服务器端脚本语言,虽然不是为高性能计算而设计,但其丰富的库和简洁的语法使得实现这些算法变得...

    基于c语言的排列组合算法

    在这个“基于C语言的排列组合算法”中,我们将深入探讨这两个概念以及如何使用C语言来实现它们。 排列是有限集合中的元素的一种有顺序的排列方式。在C语言中,我们可以使用递归方法来实现排列算法。首先,我们需要...

    排列组合算法实现

    排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。

    excel VBA - 排列组合生成算法 - 可指定和值 - 可输出文本文件.xls

    excel VBA - 排列组合生成算法 - ,可快速生成指定项目的所有排列组合

    c++ 排列组合算法,代码简单

    根据给定的文件信息,我们可以总结出以下关于C++中排列组合算法的知识点: ### C++中的排列组合算法实现 #### 1. 排列算法(Permutation) 在C++中,排列算法通常用于生成一组元素的所有可能顺序。在给定的代码中...

    Java排列组合算法分析和代码实现

    总之,这个资源包提供了一个很好的平台,让你能够深入理解并实践Java中的排列组合算法。通过学习和理解这些代码,你不仅可以增强算法设计能力,还能提高解决实际编程问题的能力。记得动手实践,结合文档和代码,将...

    java排列组合算法

    在Java中实现排列组合算法可以帮助我们解决很多实际问题,比如数据排序、数据筛选等。下面将详细介绍排列和组合的基本概念以及在Java中的实现方法。 **排列** 是指从n个不同元素中取出m(m≤n)个元素,按照一定的...

    组合数学之排列组合生成算法

    组合数学之排列组合生成算法,很好的学习组合排列算法的资料

    求排列组合的算法

    在编程中,实现排列组合算法可以帮助我们解决各种问题,比如数据排序、组合优化、概率计算等。 首先,我们要了解排列与组合的区别。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,而组合则...

    Java排列组合算法 - 郭睿的专栏 - CSDN博客

    Java排列组合算法 - 郭睿的专栏 - CSDN博客Java排列组合算法 - 郭睿的专栏 - CSDN博客

    排列组合生成算法

    - 输入排列组合算法的代码,确保正确包含必要的头文件,如`#include &lt;iostream&gt;`,`#include &lt;algorithm&gt;`等。 - 使用`std::cout`打印结果,或者将结果保存到文件中。 - 编译并运行程序,观察输出结果。 4. **...

    排列组合的全排列算法(交换算法)

    在本场景中,我们关注的是"交换算法",它用于生成一个给定数组的所有可能排列。全排列是指从n个不同元素中取出m个元素(m≤n),按照一定的顺序排列起来的所有可能的排列方式。当m等于n时,即为全排列。 交换算法,...

    排列组合算法排列组合算法.doc

    在实际应用中,排列组合算法常常用于解决实际问题,如组合优化、数据分组、密码学等。例如,搜索引擎的搜索结果排序、推荐系统中的物品推荐、图论中的路径查找等,都可能涉及到排列组合的问题。熟练掌握这些算法对于...

    算法 排列组合生成器 后端

    这个项目为开发者提供了一个学习和实践排列组合算法、SpringBoot框架以及H2数据库整合的绝佳案例。它不仅展示了如何在后端实现复杂的算法,还涵盖了数据库管理和API设计等多个核心技能。对于希望提升后端开发能力的...

    qtc++排列组合实现

    在编程领域,排列组合是算法设计中的一个重要概念,它涉及到...通过以上方法,我们可以在Qt C++环境中高效地实现排列组合算法。无论是用于学术研究,还是解决实际的编程问题,掌握这些知识都将对你的编程生涯大有裨益。

    Java排列组合算法

    本文将深入探讨Java中实现排列组合算法的方法,帮助开发者更好地理解和运用这些概念。 排列是有序的选择,而组合是无序的选择。在Java中,我们可以使用递归、回溯法或者迭代的方式来实现这两种算法。下面我们将详细...

    排列组合算法

    在编程领域,排列组合算法是解决许多问题的关键技术,尤其在数据处理、数据分析以及优化问题中扮演着重要角色。在C#编程环境下,利用这些算法可以有效地生成所有可能的序列或者选择,帮助开发者构建出高效的解决方案...

Global site tag (gtag.js) - Google Analytics