从论坛里一哥们的回复中摘来的,反正我是受教了。
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实验--求一个集合的子集,非递归实现。
递归算法求阶乘的基本思路是定义一个函数,该函数调用自身来计算较小值的阶乘,直到基本情况(通常是n=1或n=0)出现,此时返回1作为结果。 易语言中的递归算法求阶乘可能如下所示: ```易语言 .程序集 .子程序 _ ...
在子集和问题中,递归回溯算法可以高效地遍历所有可能的子集组合,从而找到符合条件的解。 #### 四、代码解析 给定的代码实现了一个简单的递归回溯算法来解决子集和问题。 1. **获取输入**: - 首先,用户输入一...
试写一个递归算法实现求一个集合的所有子集。 算法设计: 给定一个非空的集合,用递归算法输出它的所有子集。 数据输入: 由文件input.txt 提供输入数据。文件第1行是集合中的元素个数,第2行是集合的元素序列(元素...
### 算法设计与分析:子集和问题 #### 问题定义 子集和问题是一种经典的计算机科学问题,属于NP完全问题。该问题的基本形式是:给定一个正整数集合\( S=\{x_1,x_2,…,x_n\} \)和一个正整数\( c \),询问是否存在...
总之,交错幂集是集合的子集的一种独特组合,通过递归算法可以在C++中有效地计算出来。在给定的代码中,`computePermutations`函数通过递归调用来生成指定长度的交错幂集,从而展示了解决这类问题的思路。
该问题的描述是:已知N个大于0的整数构成一个集合,即{1,2,3,……,N},求其所有的非空且元素不相邻的子集,计算所有子集的乘积的平方的和。 知识点1:子集的概念 子集是集合中的一部分元素的集合。在这个问题中...
回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...
因此,非递归算法的出现为解决这个问题提供了另一种思路。 非递归算法避免了函数调用的开销,它们通常使用循环结构来实现,这使得它们在内存管理上更为高效。对于划分算法的非递归实现,我们可以考虑使用迭代的方式...
在求集合子集问题中,递归算法的基本思想是:对于集合S,其子集可以分为两类:包含当前元素S[i]的子集和不包含当前元素的子集。通过递归调用,我们可以分别生成这两类子集,并将它们合并以得到S的所有子集。 下面是...
例如,将一个具有n个元素的集合S划分为k个非空且互不相交的子集,可以使用递归方法来计算所有可能的划分方案数s(n, k)。对于这类问题,可以通过分析较小规模的子问题来推导出大问题的解决方案。 总之,Pascal语言中...
### 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. **基础条件**:递归算法必须有一个或多个基础条件(或...
给定一个非空的集合,用递归算法输出它的所有子集。由文件input.txt 提供输入数据。文件第1行是集合中的元素个数,第2行是集合的元素序列(元素之间用空格分隔)。将计算出的所有子集分行输出到文件output.txt中。
通过创建和复制文件,我们可以将每个子集视为文件内容的一部分,随着算法的执行,文件内容会不断地更新和扩展,最终保存所有的子集。这种方法可能的优点是利用了文件系统作为数据存储和处理的媒介,可能在某些特定...
10. 快速排序:递归地将数组分成小于和大于基准值的部分,然后对每个部分再次进行快速排序,直到所有部分都有一个元素或为空。 11. 计算合数:找到所有使得其分划整数之和为n的整数集合,递归地检查每个可能的子集...
【Pascal递归算法在NOIP竞赛中的应用】 在信息学奥林匹克竞赛(NOIP)中,递归算法是一项重要的技能,对于解决复杂问题至关重要。递归算法是指一个过程(或函数)通过直接或间接地调用自身来解决问题的方法。递归...
递归算法在解决树形结构、图遍历、排序算法(如快速排序、归并排序)和搜索算法(如深度优先搜索)等问题时特别有用。例如,阶乘计算可以使用递归实现: ```cpp int factorial(int n) { if (n == 0 || n == 1) { /...