`
一个人旅行
  • 浏览: 92329 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

递归算法-求所有和为10的子集

阅读更多
从论坛里一哥们的回复中摘来的,反正我是受教了。
import java.util.Stack;

public class SubsetCalc {

	private int[] a = { 8, 5, 4, 3, 2, 1 };
	private int sum = 10;
	private Stack<Integer> stack = new Stack<Integer>();
	private int stackSum = 0;

	private void calc(int from, int to) {
		if (stackSum == sum) {
			for (Integer i : stack)
				System.out.print(i + " ");
			System.out.println();
			return;
		}

		for (int i = from; i < to; i++) {
			if (stackSum + a[i] <= sum) {
				stackSum += stack.push(a[i]);
				calc(i + 1, to);
				stackSum -= stack.pop();
			}
		}
	}

	public void subsets() {
		calc(0, a.length);
	}

	public static void main(String[] args) {
		new SubsetCalc().subsets();
	}
}

此算法有两种思路在里面。
1.遍历过程得到了所有子集的情况;
2.在1的基础之上得到和为10的子集。

纠正:上面1中所说有误,应是:遍历过程得到了所有和小于等于10的所有子集的情况。
补充:遍历所有子集的情况的代码如下
public class RecursionTest {

	private int[] a={8,5,4,3,2,1};
	private Stack<Integer> stack=new Stack<Integer>();
	
	private void calc(int from, int to)
	{
		for(int i=from;i<to;i++)
		{
			stack.push(a[i]);
			calc(i+1,to);
			stack.pop();
		}
		for(Integer i:stack)
		{
			System.out.print(i+" ");
		}
		System.out.println();
	}
	public void subsets()
	{
		calc(0,a.length);
	}
	public static void main(String[] args) {
		new RecursionTest().subsets();
	}
}
分享到:
评论

相关推荐

    java实验--求一个集合的子集

    java实验--求一个集合的子集,非递归实现。

    易语言递归算法求阶乘

    递归算法求阶乘的基本思路是定义一个函数,该函数调用自身来计算较小值的阶乘,直到基本情况(通常是n=1或n=0)出现,此时返回1作为结果。 易语言中的递归算法求阶乘可能如下所示: ```易语言 .程序集 .子程序 _ ...

    分治算法-求众数问题-python实现

    - 特点:分治算法通过将数据集递归地划分为较小的子集,并分别计算子集的众数,然后合并子问题的解来得到原问题的解。 2. 算法步骤 - 分解:将数据集分成两个子集,分别计算每个子集的众数和出现次数。 - 解决:...

    子集和问题(算法设计,acm)

    在子集和问题中,递归回溯算法可以高效地遍历所有可能的子集组合,从而找到符合条件的解。 #### 四、代码解析 给定的代码实现了一个简单的递归回溯算法来解决子集和问题。 1. **获取输入**: - 首先,用户输入一...

    递归算法(阶乘)

    以Java语言为例,递归算法和循环算法是实现阶乘计算的两种常见方法。它们各有优劣,在实际应用中需要根据具体问题的性质和要求来选择合适的方法。 首先,让我们详细探讨递归方法在计算阶乘中的应用。在递归方法中,...

    求集合的所有子集问题

    试写一个递归算法实现求一个集合的所有子集。 算法设计: 给定一个非空的集合,用递归算法输出它的所有子集。 数据输入: 由文件input.txt 提供输入数据。文件第1行是集合中的元素个数,第2行是集合的元素序列(元素...

    算法设计与分析-子集和问题

    ### 算法设计与分析:子集和问题 #### 问题定义 子集和问题是一种经典的计算机科学问题,属于NP完全问题。该问题的基本形式是:给定一个正整数集合\( S=\{x_1,x_2,…,x_n\} \)和一个正整数\( c \),询问是否存在...

    C++使用递归算法求交错幂集

    总之,交错幂集是集合的子集的一种独特组合,通过递归算法可以在C++中有效地计算出来。在给定的代码中,`computePermutations`函数通过递归调用来生成指定长度的交错幂集,从而展示了解决这类问题的思路。

    回溯法求解子集和问题

    回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...

    求子集问题--一个ACM程序竞赛题

    该问题的描述是:已知N个大于0的整数构成一个集合,即{1,2,3,……,N},求其所有的非空且元素不相邻的子集,计算所有子集的乘积的平方的和。 知识点1:子集的概念 子集是集合中的一部分元素的集合。在这个问题中...

    划分的非递归算法

    因此,非递归算法的出现为解决这个问题提供了另一种思路。 非递归算法避免了函数调用的开销,它们通常使用循环结构来实现,这使得它们在内存管理上更为高效。对于划分算法的非递归实现,我们可以考虑使用迭代的方式...

    1.4 求集合的所有子集问题.rar

    在求集合子集问题中,递归算法的基本思想是:对于集合S,其子集可以分为两类:包含当前元素S[i]的子集和不包含当前元素的子集。通过递归调用,我们可以分别生成这两类子集,并将它们合并以得到S的所有子集。 下面是...

    pascal递归算法.doc

    例如,将一个具有n个元素的集合S划分为k个非空且互不相交的子集,可以使用递归方法来计算所有可能的划分方案数s(n, k)。对于这类问题,可以通过分析较小规模的子问题来推导出大问题的解决方案。 总之,Pascal语言中...

    Java使用递归算法求交错幂集(源代码)

    ### Java使用递归算法求交错幂集(源代码) #### 交错幂集概念解析 交错幂集(Alternating Power Set)并非数学上的标准术语,但从上下文可以理解为:求解一个集合的幂集时,对每个子集的元素顺序进行交错排列。...

    求一个集合子集的算法示例

    以下是一个简单的回溯递归算法实现: ```python def subset_recursion(set, current_subset, result): if not set: result.append(current_subset) else: subset_recursion(set[1:], current_subset, result) ...

    易语言源码递归算法1.7z

    递归算法指的是在函数或子程序的定义中直接或间接调用自身的一种方法,它通常用于解决那些可以简化为相同问题子集的问题。 递归算法主要基于两个基本原则: 1. **基础条件**:递归算法必须有一个或多个基础条件(或...

    求集合的所有子集

    给定一个非空的集合,用递归算法输出它的所有子集。由文件input.txt 提供输入数据。文件第1行是集合中的元素个数,第2行是集合的元素序列(元素之间用空格分隔)。将计算出的所有子集分行输出到文件output.txt中。

    子集打印问题~新奇算法

    通过创建和复制文件,我们可以将每个子集视为文件内容的一部分,随着算法的执行,文件内容会不断地更新和扩展,最终保存所有的子集。这种方法可能的优点是利用了文件系统作为数据存储和处理的媒介,可能在某些特定...

    递归算法练习.pdf

    10. 快速排序:递归地将数组分成小于和大于基准值的部分,然后对每个部分再次进行快速排序,直到所有部分都有一个元素或为空。 11. 计算合数:找到所有使得其分划整数之和为n的整数集合,递归地检查每个可能的子集...

Global site tag (gtag.js) - Google Analytics