`
XD.zhang
  • 浏览: 11136 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

子集和数问题——回溯法

阅读更多

                                                           子集和数问题——回溯法

 

 

 

                回溯算法可以用来求最优解,也可以用来搜索某些问题的答案。回溯法又叫做试探法,它是以深度优先遍历的方式找各种符合要求的答案,在查找过程中伴随着一些减枝函数来提高效率。这种算法比较简单,比较出名的问题有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_SumOfSub_回溯法_回溯法子集和_子集和数_子集和数问题

    综上所述,"sumofsub.rar"文件提供了一个使用回溯法解决子集和数问题的实例。通过理解回溯法的基本原理和实现步骤,我们可以学习如何有效地解决这类组合优化问题。在实际应用中,理解并掌握这种算法对于处理类似问题...

    子集和数 C语言求解

    总的来说,子集和数问题展示了如何利用回溯法在C语言中解决组合问题。通过对所有可能子集的穷举,并在每一步检查是否达到目标和,我们可以找到所有满足条件的解。这个过程涉及到递归、回溯以及基本的数组操作,是...

    子集打印问题~新奇算法

    经典的子集问题可以通过递归或回溯法来解决。对于一个包含n个元素的集合,它有2^n个不同的子集(包括空集和集合本身)。递归方法的基本思路是从第一个元素开始,每次决策是否将其加入当前子集,这样就形成了两个分支...

    子集和(回溯法)

    利用回溯法求子集和(给定sum,求出任意一个满足条件的集合)

    1122 子集和数问题

    为了解决子集和数问题,首先需要对回溯法有充分的理解。回溯法是一种通过试错来寻找问题解决方案的算法。当当前的搜索路径无法达到目标解时,算法会撤销上一步或几步的操作,并通过改变决策来尝试新的路径。在子集...

    子集树问题c++试设计一个用回溯法搜索子集空间树的函数。

    ### 子集树问题与回溯法在装载问题中的应用 #### 一、问题背景及定义 本篇文章探讨了一个特定的计算机科学问题——装载问题,它属于组合优化领域的一个经典案例。装载问题的具体表述是:假设有一艘最大载重量为 \...

    算法设计与分析:第8章 回溯法.ppt

    2. 子集和数问题:回溯法可以用于解决子集和数问题,即在给定一个集合和一个目标值时,寻找一个子集,使得该子集的元素之和等于目标值。 3. 图的着色问题:回溯法可以用于解决图的着色问题,即在给定一个图和一些...

    5-1+_子集和问题_

    试设计一个解子集和问题的回溯法。对于给定的正整数的集合 S={x1,x2,…,xn }S={x1,x2,…,xn }和正整数 c,编程计算 S 的一个子集S1,使得∑x∈S1x=c ∑x∈S1x=c。数据输入:第 1 行有 2 个正整数 n 和 c,n ...

    图的着色问题-回溯法-子集树

    《图的着色问题——基于回溯法的子集树》 在计算机科学中,图的着色问题是一项经典的组合优化问题,它涉及到如何给一个图的各个顶点分配颜色,使得相邻的顶点不能拥有相同的颜色。这个问题在实际应用中广泛出现,如...

    回溯法求解子集和数给定一个n个整数的集合X={x1,x2....xn}和整数y,找出和等于y的X的子集Y.

    根据给定的信息,本文将详细解释如何利用回溯法解决子集和问题。具体来说,我们将探讨以下几个方面: 1. **子集和问题定义及应用场景**:解释子集和问题的基本概念及其在实际中的应用。 2. **回溯法原理**:介绍...

    01背包问题回溯法解决子集树

    在01背包问题中,回溯法构建了一个子集树,每个节点代表一个可能的物品选择状态。从根节点(空背包)开始,每层节点代表当前已经选取的物品,直到叶子节点(所有物品都被考虑过)。 以下是回溯法解决01背包问题的...

    算法设计实现题子集和问题c实现

    试设计一个解子集和问题的回溯法。 算法设计:对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,计算S的一个子集S1,使得子集里的元素之和为c。 数据输入:由文件input.txt提供输入数据。文件第1行有2个正整数n和c...

    用C/C++编写的子集和数问题

    用定长和不定长两种方法编写,不会令大家失望的

    子集树问题 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。

    根据给定文件的信息,本文将围绕“子集树问题”展开讨论,重点在于设计一个采用回溯法搜索子集空间树的函数,并将其应用于解决装载问题。首先,我们需要明确几个核心概念: ### 回溯法简介 回溯法是一种通过尝试...

    使用回溯法求集合的子集

    总的来说,回溯法求集合子集是一种高效且直观的方法,尤其适用于小规模问题。它通过深度优先搜索策略避免了无效的计算,而递归实现则使得代码简洁易懂。在实际编程中,可以通过优化剪枝条件,进一步提高算法效率。

    0-1背包问题(回溯法)报告.doc

    在这个问题中,回溯法通过遍历所有可能的物品子集来寻找最大价值的解决方案。 实验原理基于解空间树的概念,其中每个节点代表一个物品子集。在搜索过程中,如果左子树的节点是可行的,就进入左子树。如果当前节点的...

    子集和问题子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,...,xn}是一个正整数的集合,c

    试设计一个解子集和问题的回溯法。 «编程任务: 对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,编程计算S 的一个子集 S1,使得x∈S1,∑x=c. Input 由文件input.txt 提供输入数据。文件第1 行有2 个正整数...

    利用回溯法解0-1背包问题讲解

    利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 * 它在包含问题的所有解的解...

Global site tag (gtag.js) - Google Analytics