7-1 子集和问题--回溯法(算法设计与分析)

这篇具有很好参考价值的文章主要介绍了7-1 子集和问题--回溯法(算法设计与分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

7-1 子集和问题

作者 陈晓梅    单位 广东外语外贸大学

设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法,并输出利用回溯法在搜索树(按输入顺序建立)中找到的第一个解。

输入格式:

输入数据第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的1行中,有n个正整数,表示集合S中的元素。
是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。

输出格式:

输出利用回溯法找到的第一个解,以空格分隔,最后一个输出的后面有空格。当问题无解时,输出“No Solution!”。

输入样例:

在这里给出一组输入。例如:

5 10
2 2 6 5 4

输出样例:

在这里给出相应的输出。例如:

2 2 6 

子集和问题 

思路:(回溯法) 根据已选元素之和 加上 当前元素加到最后一个元素 来判断

 代码如下:

#include<iostream>
using namespace std;

int n;
int c;
int final=0;  //当前元素加到最后一个元素 的总和
int sum=0;   //已选元素之和
int a[10000];   //原数组
bool b[10000];   //判断元素选不选

bool Backtrack(int t){
	if(sum==c) return true;  //已找到
	if(t>n) return false;    //未找到
	
	final-=a[t];   //先减去该元素
	
	if(sum+a[t]<=c){    //如果 已选元素之和 加上 该元素 小于等于c,则
		b[t]=true;    //选上该元素
		sum+=a[t];   //已选元素之和 加上 该元素
		if(Backtrack(t+1)) return true;   //下一个元素Backtrack成功 返回true
		sum-=a[t];    //否则 减回去
	}
	
	if(sum+final>=c){     //如果 已选元素之和 加上 当前元素加到最后一个元素的总和 大于等于c, 则
		b[t]=false;    //不选当前元素
		if(Backtrack(t+1)) return true;  //下一个元素Backtrack成功 返回true
	}
	
	final+=a[t];   //加回去
	return false;   //未找到
}

int main(){
	cin>>n>>c;
	for(int i=0;i<n;i++){
		cin>>a[i];
		final+=a[i];
	}
	if(!Backtrack(0))
	  cout<<"No Solution!"<<endl;
	else{
		for(int i=0;i<n;i++){
			if(b[i]) cout<<a[i]<<" ";  //如果该元素为ture,则输出
		}
	}
	return 0;
}

输入:

5 10

2 2 6 5 4

输出:

2 2 6文章来源地址https://www.toymoban.com/news/detail-756615.html

到了这里,关于7-1 子集和问题--回溯法(算法设计与分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法与数据结构——递归算法+回溯算法——八皇后问题

    八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。 回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算

    2024年02月09日
    浏览(55)
  • 【算法设计与分析】3.回溯法—地图填色问题

    回溯法地图填色pre ppt 回溯法地图填色报告word 回溯法地图填色c++源代码 目录 相关资源下载 碎碎念 概览 背景知识 问题描述: 原理 回溯算法原理 回溯法涉及几个概念 回溯法伪代码 地图填色(回溯法) 搜索顺序策略(按优先级排序) 剪枝策略 地图数据获取 回溯填色伪代码

    2023年04月22日
    浏览(36)
  • 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了, 想复制完整代码直接复制最下面的 ,想复制分布代码去看我博客园链接吧 《数据结构与算法分析》课程设计——迷宫问题 - 刷子zz - 博客园 一、  问题描述 问题中迷宫可用方阵[m,n]表示,0表示能通过

    2024年02月10日
    浏览(52)
  • 【算法设计与分析】回溯法解决运动员配对问题(课程设计)

    针对运动员最佳配对问题,本文利用回溯法寻求竞赛优势得分最优解,研究男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。针对这一问题,本题采用的是男运动员选女运动员的方法,构成了一棵排列树。树的结点表示女运动员,排列树的层数表示男运动员

    2024年02月10日
    浏览(95)
  • 算法设计与分析实验4 :利用动态规划的方法解决子集等和分割判断问题

    实验4  利用动态规划的方法解决子集等和分割判断问题 一、实验目的 1. 了解动态规划的主要思想。 2. 掌握背包问题解决方法用以解决该问题。 3. 分析核心代码的时间复杂度和空间复杂度。 二、实验内容和要求 题目:给定一个只包含正整数的非空数组。是否可以将这个数组

    2024年04月23日
    浏览(42)
  • 计算机算法分析与设计(22)---回溯法(最小重量机器设计问题)

     设某一机器由 n n n 个部件组成,每种部件都可以从 m m m 个不同的供应商处购得。设 w i j w_{ij} w ij ​ 是从供应商 j j j 处购得的部件i的重置, c i j c_{ij} c ij ​ 是相应的价格。设计一个算法,给出总价格不超过 d d d 的最小重量机器设计。 数据输入: 第 1 1 1 行有 3 3 3 个正整

    2024年02月06日
    浏览(46)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(62)
  • 子集和数问题(回溯法)

    【问题描述】给定一个n个整数的集合X={x1,x2,…xn}(X中可能包含重复元素)和整数y,找出和等于y的X的子集Y。例如说,如果X={10,30,20,60,40,50},和y=60,则有4种不同的解,他们分别是{10,20,30},{10,50},{20,40},{60}。 【输入形式】输入的第1行包含两个整数n和y,分别表示集合X的长度和目标

    2024年02月09日
    浏览(36)
  • 回溯法——求解子集和问题(Java)

    给定n个不同的正整数的集合w={w1,w2,…,wn}和一个正整数W,要求找出w的子集s, 使该子集中所有的元素的和为W 。例如,当n=4时,w={11,13,24,7},W=31,则满足要求的子集为(11,13,7)和(24,7)。 和0/1背包问题一样,该问题的解空间数是一颗子集树。设解向量x=(x1,

    2024年02月06日
    浏览(48)
  • DFS:深搜+回溯+剪枝解决排列、子集问题

                                        创作不易,感谢三连支持!!  . - 力扣(LeetCode) . - 力扣(LeetCode)  方案1:不合法就continue 方案2:合法才能进循环 . - 力扣(LeetCode) . - 力扣(LeetCode)  策略1:决策树以选不选作为参考,结果为叶子节点 策略2:决策树以选几个

    2024年04月16日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包