回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:

1、定义一个解空间,它包含问题的解。

2、利用适于搜索的方法组织解空间。

3、利用深度优先法搜索解空间。

4、利用限界函数避免移动到不可能产生解的子空间。

问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

import java.util.ArrayList;
import java.util.Scanner; public class zijihewenti {
public static int [] num;
public static int min = Integer.MAX_VALUE;
public static String str = "";
public static int sum = 0,c;
public static boolean [] bool;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
c = sc.nextInt();
num = new int [n+1];
bool = new boolean [n+1];
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <=n; i++) {
num[i]=sc.nextInt();
}
f(0,list);
System.out.println(str);
}
public static void f(int a,ArrayList<Integer> list){
if(sum==c){
int sum = 0;
for (int i = 0; i <list.size(); i++) {
sum=list.get(i)+sum;
}
if(sum<min){
str = "";
min=sum;
for (int i = 0; i < list.size(); i++) {
str=str+num[list.get(i)]+" ";
}
}
return;
}
for (int i = 1; i <num.length; i++) {
if(!bool[i]){
bool[i]=true;
sum+=num[i];
list.add(i);
f(a+1,list);
bool[i]=false;
sum-=num[i];
list.remove(a);
}
} } }

(Java实现) 子集和问题的更多相关文章

  1. java实现子集和问题

    1 问题描述 求n个正整数构成的一个给定集合A = {a1,a2,a3,-,an}的子集,子集的和要等于一个给定的正整数d.请输出所有符合条件的子集. 2 解决方案 2.1 全排列思想求解 方法1:首 ...

  2. JAVA语言学校的危险性

    Java语言学校的危险性(译文) 作者: 阮一峰 日期: 2008年12月 7日 下面的文章是More Joel on Software一书的第8篇. 我觉得翻译难度很大,整整两个工作日,每天8小时以 ...

  3. [No0000184]JAVA语言学校的危险性

    下面的文章是More Joel on Software一书的第8篇. 原文: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools ...

  4. JavaEE填空与判断

    Java EE软件工程师认证考试 试题库- 填空题和选择题   一.     填空题 1. HTML网页文件的标记是__html__,网页文件的主体标记是_body__,标记页面标题的标记是__tit ...

  5. Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验

    Special subset sums: meta-testing Let S(A) represent the sum of elements in set A of size n. We shal ...

  6. JavaScript: 世界上最被误解的语言|Douglas Crockford

    JavaScript: 世界上最被误解的语言 JavaScript: The Wrrrld's Most Misunderstood Programming Language Douglas Croc ...

  7. JS 精粹(一)

    先说说JS是容易被误解的语言的观点.从名字上来看,"Java"这似乎暗示着这门语言与Java的关系:好像这门语言是Java的子集,或比Java弱.但实际与Java并无关系,如果说非 ...

  8. 一篇博文将JavaScript尽收眼底

    简介 这篇文章是为专业程序员介绍的JavaScript语言的,它是一种小巧的语言,如果你熟悉其他的编程语言,那么这篇文章对你来讲不是那么难以理解. JavaScript不是Java,他们是两门完全不同 ...

  9. PL真有意思(一):引言

    前言 断断续续学编译原理到之前发过写一个编译器和正则表达式引擎系列文章也有一段时间了,然后最近看完PLP这本书,这本书应该算是入门书,但是对我这种半吊子收获很大.所以为了弥补最近学操作系统和接外包摸的 ...

  10. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

随机推荐

  1. k近邻法(一)

    简介 k近邻法(k-nearest neighbors algorigthm) 是一种最基本的用于分类和回归的方法之一,当没有关于训练数据的分布时,首先最容易想到的就是采用k近邻法. k近邻法输入为实 ...

  2. python --RecursionError: maximum recursion depth exceeded in comparison

    在学习汉娜塔的时候,遇到一个error RecursionError: maximum recursion depth exceeded in comparison 经过百度,百度的方法: 加上: i ...

  3. vue $refs的静态绑定使用与动态绑定使用

    以下实例实现的同一个操作 静态使用 this.$refs.tbhead.clearSelection(); 动态使用 area="tbhead" //可以是函数传入的参数 this ...

  4. 改进Page Object公共方法封装(base_page)

    import os from time import sleep from selenium import webdriver from selenium.webdriver.common.by im ...

  5. Zookeeper 如何保证分布式系统数据一致性

    写在前面 分布式架构出现后,越来越多的分布式系统会面临数据一致性的问题.目前,ZooKeeper 是在解决分布式数据一致性上最成熟稳定且被大规模应用的工业级解决方案. ZooKeeper 保证 分布式 ...

  6. node 之 ... 扩展运算符报错

    使用pm2的遇到的问题:(实际上是 node 版本不一致导致的问题) 描述:sudo 下的node版本和 全局下的node版本不一致导致...扩展运算符报错. 实例: { "apps&quo ...

  7. Angular 服务对象的作用范围

    1.高阶话题:服务对象的作用范围 声明服务提供者的方式: 方式1:在根模块中提供服务对象-----在整个应用中服务是单例 @Injectable({ providedIn:'root' }) expo ...

  8. 教你避过安装TensorFlow的两个坑

    TensorFlow作为著名机器学习相关的框架,很多小伙伴们都可能要安装它.WIN+R,输入cmd运行后,通常可能就会pip install tensorflow直接安装了,但是由于这个库比较大,接近 ...

  9. hdu4746莫比乌斯反演进阶题

    Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others)Total S ...

  10. 解决You should consider upgrading via the 'python -m pip install --upgrade pip' command. (pip工具版本较低导致)

    步骤1:  找到pip- 版本号 dist-info 文件夹 操作: 在python的安装目录下的Lib文件下的site-packages文件夹下找到 ip- 版本号 dist-info 文件夹   ...