求解子集和问题的解

题目描述:

给定有n个不同正整数的集合w=(w1,w2,… ,wn)和一个正数W,要求找出w的子集s,式该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)

分析思路:

n=4时,解空间树如图(结点中的数字是结点的编号,例如结点18对应解向量为(1,1,0,1),选择的整数和=11+13+7=31),从i层到i+1层(1<=i<=n)的每一条边标有xi的值,xi或者为1或者为0,xi为1时表示取wi为整数,xi为0时表示不去wi为整数,从根节点到叶子结点的所有路径定义了解空间。

时间复杂度 O(2^n),解空间树中有 2^ (n+1) -1个结点

求解该问题需要搜索整个解空间树,设解向量x=(x1,x2,…,xn),本问题是求所有解,所以一旦搜索到叶子结点(即i=n+1),如果相应的子集和为W,则输出x解向量。搜索到第i(1<=i<=n)层的某个结点时用tw表示选取的整数和,rw表示余下的整数和,rw表示余下的整数和,rw=w[j] (j从i+1到n)

(1)约束函数:检查当前整数w[i]加入子集和是否超过W,若超过,则不能选择该路径。用于左孩子结点剪枝。

(2)限界函数:一个结点满足tw+rw<W,即即使选择剩余的所有整数,也不可能找到一个解。用于右孩子剪枝。

代码:

#include<stdio.h>
#define MAXN 20int n=4,W=31;
int w[]={0,11,13,24,7};  //存放所有整数,不要下标为0的元素
int count=0;  //累计解个数
void dispsolution(int x[])
{int i;printf("第%d个解:\n",++count);for(int i=1;i<=n;i++)if(x[i]==1)printf("%d ",w[i]);printf("\n");} void dfs(int tw,int rw,int x[],int i) //求解子集和 {//tw 考虑第i个整数时选取的整数和,rw为剩下的整数和if(i>n)   //找到一个叶子结点{if(tw==W)    //找到一个满足条件的解输出dispsolution(x); } else    //尚未找完所有整数 {if(tw+w[i]<=W)  //左孩子结点剪枝:选取满足条件的整数w[i]{x[i]=1;  //选取第i个整数 dfs(tw+w[i],rw-w[i],x,i+1); } if(tw+rw>W)  //右孩子结点剪枝:剪出不可能存在解的结点{x[i]=0;  //不选取第i个整数,回溯 dfs(tw,rw-w[i],x,i+1);} }}
int main(){int x[MAXN];  //存放一个解向量int rw=0;for(int j=1;j<=n;j++)   //求所有整数和rw+=w[j];   dfs(0,rw,x,1);   //i从1开始 }

回溯法 —— 求解子集和问题相关推荐

  1. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  2. 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...

  3. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  4. 使用回溯法求解装载问题

    回溯法解决装载问题(java实现) 问题描述:有n个集装箱要装上两艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且:∑ wi ≤ C1+C2. 求是否有一个合理的装载方案能将这 n 个集装 ...

  5. 回溯法求解0-1背包问题(细节分析)

    回溯法求解0-1背包问题(细节分析) 论temp数组的必要性和判断cv>bestv的不必要性 回溯法 应用回溯法求解问题时,首先应明确定义问题的解空间,该解空间应至少包含问题的一个最优解.例如, ...

  6. 回溯法求解N皇后问题(Java实现)

    回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解.这种迭代类似于穷举并且是试探性的,因为当目前的可 ...

  7. php生成迷宫图片,PHP实现基于回溯法求解迷宫问题的方法详解

    本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法.分享给大家供大家参考,具体如下: 引言 最近在leetcode上看了些算法题,有些看着很简单的很常用的东西,竟然一下子想不出来怎么求解,比如说:实 ...

  8. 回溯法求解图着色问题

    回溯法求解图着色问题 #include <iostream> #include <cstdlib> using namespace std; #define n 5 #defi ...

  9. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

最新文章

  1. 悠然乱弹:我的开源观
  2. 建站常用13种PHP开源CMS比较
  3. Outlook数据提取工具readpst
  4. java date 格式化_Date类日期格式化
  5. java元婴期(27)----java进阶(springmvc(1)---springmvc框架入门程序(上)(不基于注解开发))
  6. babylonjs 分部加载模型_如何使用BabylonJS加载OBJ或STL模型
  7. 什么是空间复杂度(What is actually Space Complexity ?)
  8. kali 切换图形界面_kali Linux 文本图形界面切换遇到的怪问题
  9. LM NTLM ophcrack RainBow table (转)
  10. Liferay的架构:缓存(第一部分)
  11. html教图片程,html教的程大全.pdf
  12. 调用栈(call stack)
  13. 算法复杂性渐近阶的分析
  14. 最新TIOBE编程语言排行:C语言第一,Python反超Java,挤进第二
  15. Linux系统root用户登录后显示 “-bash-4.2#” 解决方案
  16. C++调用Lua出现 unproteted error in call to Lua API错误的发现过程与解决方法
  17. 京东11.11:商品搜索系统架构设计解密
  18. mac下如何在多种输入法中达到最好的切换体验
  19. 没有网服务器怎么打开网页,苹果手机没有浏览器怎么打开网页
  20. html盒子移动动画代码,js实现盒子滚动动画效果

热门文章

  1. 什么是python基础教程-最好的Python入门教程是?
  2. python三本经典书籍-有哪些 Python 经典书籍?
  3. 专科python应届生工资多少-阿里巴巴达摩院招聘应届生
  4. 教你在win10系统开启和使用语音识别
  5. 转:基于科大讯飞语音API语音识别开发详解
  6. ES6 class关键字 ~ 非常详细
  7. Node-介绍与模块化
  8. 【王道操作系统笔记】进程定义组成组织方式特征
  9. 利用计算机解决的生活问题,利用计算机解决经典动力学问题
  10. idea默认文件类型关联