子集和数问题——回溯法
回溯算法可以用来求最优解,也可以用来搜索某些问题的答案。回溯法又叫做试探法,它是以深度优先遍历的方式找各种符合要求的答案,在查找过程中伴随着一些减枝函数来提高效率。这种算法比较简单,比较出名的问题有8皇后问题。这个子集和数问题也可以用回溯法搞定。。。
所谓子集和数问题,就是给定你一个数的集合M,再给你一个数num,找出所有属于M且和为num的数的集合。比如M={1,2,3} num=3,则N为{1,2}和{3}。这些都比较简单,还是直接上代码吧。。。
public class SubNum {
// 初始化化一个数组
int M[] = {1,2,3,4,5,6,7,8,9};
int N[] = new int[9];
//用来标识在某种组合中某个数字是否出现
boolean [] judge =new boolean [9];
int num;//给定的num
int temp;//保存和
// 初始化化num
public SubNum(int num) {
this.num = num;
}
// 采用回溯法解决。。
public void findSub() {
for (int a = 0; a < M.length; a++) {
for (int b = a + 1; b < M.length; b++) {
for(int i=0;i<M.length;i++){//初始化标示数组
judge [i]=false;
}
temp = M[a];
judge[a]=true;
for (int c = b; c < M.length; c++) {
temp += M[c];
judge[c]=true;
if (num == temp) {// 子集找到
for(int i=0;i<M.length;i++){
if(judge[i]==true)
System.out.print(M[i]+"+");
}
System.out.print("是一种答案");
System.out.println();
temp = temp - M[c];//回溯上一个节点
judge[c]=false;
} else if (temp > num) {// 若果大于,则不加这个数,加下一个。
temp = temp - M[c];
judge[c]=false;
} else if (temp < num) {
// break;// 如果仍小于,继续+。
}
}
}
}
}
public void testlast(){
if (M[M.length - 1] == num)//测试最后一位是否满足条件。。。
System.out.println(M[M.length-1] + "是一种答案");
}
public static void main(String[] agrs) {
SubNum sn = new SubNum(12);
sn.findSub();
sn.testlast();
}
}
测试结果为:
1+5+6+是一种答案
3+4+5+是一种答案
3+9+是一种答案
4+8+是一种答案
5+7+是一种答案
上面的代码有不完善的地方,我减去的旁枝较少,效率还不是很高,不过能基本体现回溯法。。。总之,理解了回溯法深度优先遍历且尽量剪去不必要枝叶的思想即可。。。
分享到:
相关推荐
给定N个数,和一个整数M,判定是否可以从N个数中取出若干个数,使它们的和等于M。输出:YES或者NO。把N个数看成一个集合,问题就是从这个集合中选出一个子集,使这个子集满足和是M
回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...
综上所述,"sumofsub.rar"文件提供了一个使用回溯法解决子集和数问题的实例。通过理解回溯法的基本原理和实现步骤,我们可以学习如何有效地解决这类组合优化问题。在实际应用中,理解并掌握这种算法对于处理类似问题...
总的来说,子集和数问题展示了如何利用回溯法在C语言中解决组合问题。通过对所有可能子集的穷举,并在每一步检查是否达到目标和,我们可以找到所有满足条件的解。这个过程涉及到递归、回溯以及基本的数组操作,是...
经典的子集问题可以通过递归或回溯法来解决。对于一个包含n个元素的集合,它有2^n个不同的子集(包括空集和集合本身)。递归方法的基本思路是从第一个元素开始,每次决策是否将其加入当前子集,这样就形成了两个分支...
利用回溯法求子集和(给定sum,求出任意一个满足条件的集合)
【子集和数问题】是计算机科学中一种经典的组合优化问题,主要涉及到回溯法的运用。该问题的目标是寻找一个给定集合的子集,使得这个子集的元素之和等于特定的目标值。在本例中,问题通过C语言进行编程解决。 ...
### 子集树问题与回溯法在装载问题中的应用 #### 一、问题背景及定义 本篇文章探讨了一个特定的计算机科学问题——装载问题,它属于组合优化领域的一个经典案例。装载问题的具体表述是:假设有一艘最大载重量为 \...
2. 子集和数问题:回溯法可以用于解决子集和数问题,即在给定一个集合和一个目标值时,寻找一个子集,使得该子集的元素之和等于目标值。 3. 图的着色问题:回溯法可以用于解决图的着色问题,即在给定一个图和一些...
试设计一个解子集和问题的回溯法。对于给定的正整数的集合 S={x1,x2,…,xn }S={x1,x2,…,xn }和正整数 c,编程计算 S 的一个子集S1,使得∑x∈S1x=c ∑x∈S1x=c。数据输入:第 1 行有 2 个正整数 n 和 c,n ...
根据给定的信息,本文将详细解释如何利用回溯法解决子集和问题。具体来说,我们将探讨以下几个方面: 1. **子集和问题定义及应用场景**:解释子集和问题的基本概念及其在实际中的应用。 2. **回溯法原理**:介绍...
在01背包问题中,回溯法构建了一个子集树,每个节点代表一个可能的物品选择状态。从根节点(空背包)开始,每层节点代表当前已经选取的物品,直到叶子节点(所有物品都被考虑过)。 以下是回溯法解决01背包问题的...
试设计一个解子集和问题的回溯法。 算法设计:对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,计算S的一个子集S1,使得子集里的元素之和为c。 数据输入:由文件input.txt提供输入数据。文件第1行有2个正整数n和c...
用定长和不定长两种方法编写,不会令大家失望的
根据给定文件的信息,本文将围绕“子集树问题”展开讨论,重点在于设计一个采用回溯法搜索子集空间树的函数,并将其应用于解决装载问题。首先,我们需要明确几个核心概念: ### 回溯法简介 回溯法是一种通过尝试...
总的来说,回溯法求集合子集是一种高效且直观的方法,尤其适用于小规模问题。它通过深度优先搜索策略避免了无效的计算,而递归实现则使得代码简洁易懂。在实际编程中,可以通过优化剪枝条件,进一步提高算法效率。
在这个问题中,回溯法通过遍历所有可能的物品子集来寻找最大价值的解决方案。 实验原理基于解空间树的概念,其中每个节点代表一个物品子集。在搜索过程中,如果左子树的节点是可行的,就进入左子树。如果当前节点的...
试设计一个解子集和问题的回溯法。 «编程任务: 对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,编程计算S 的一个子集 S1,使得x∈S1,∑x=c. Input 由文件input.txt 提供输入数据。文件第1 行有2 个正整数...
利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 * 它在包含问题的所有解的解...
《图的着色问题——基于回溯法的子集树》 在计算机科学中,图的着色问题是一项经典的组合优化问题,它涉及到如何给一个图的各个顶点分配颜色,使得相邻的顶点不能拥有相同的颜色。这个问题在实际应用中广泛出现,如...