子集和问题(回溯法)

news2024/12/24 9:17:12

目录

​​​​

前言

一、算法思路

二、分析过程

三、代码实现

伪代码:

C++:

总结


前言

问题描述】考虑定义如下的PARTITION问题中的一个变型。给定一个n个整数的集合X={x1,x2,…,xn}和整数y,找出和等于y的X的子集Y。

一、算法思路

 基本思想:确定了解空间的组织结构后,回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活结点时为止。

二、分析过程

重要❗❗❗

解的n元组:

解是一个包含0和1的n元组,其中每个元素对应集合X中对应位置的元素是否包含在子集Y中。

x的取值范围:
x为集合X中的每个元素,取值为正整数。

约束条件:
子集Y中元素之和等于给定整数y。

目标函数:
找出和等于y的X的子集Y。

三、代码实现

伪代码:

代码如下(示例):这个代码很重要!!!

INPUT:X集合(数组),  整数y
OUTPUT:X集合对应的n元布尔向量,使得对应的元素为1的xi之和为y。
    1. 初始化n元布尔向量c[n],值为-1;s=0
    2. flag ←false
    3. k ←1 
    4. while k≥ 1
    5.     while c[k]≤0
    6.          c[k] ← c[k] +1
    7.          if c[k]=1 then s=s+X[k]   
    8.            if s=y then set flag ←true, c[k+1]~c[n]←0
                                    且从两个while循环退出
    9.           else if s<y  then k k+1
   10.     end while  
   11.     s=s-X[k]                
   12.     c[k] ←-1
   13.      k ←k-1
   14.  end while
   15.  if flag then output c
   16.  else output “no solution”

C++:

#include <iostream>
#include <vector>

void subsetSumUtil(std::vector<int>& X, std::vector<int>& currSubset, std::vector<int>& result, int target, int currSum, int index) {
    if (currSum == target) {
        result = currSubset;
        return;
    }
    
    if (currSum > target || index >= X.size()) {
        return;
    }

    // Include the current element
    currSubset.push_back(X[index]);
    subsetSumUtil(X, currSubset, result, target, currSum + X[index], index + 1);
    currSubset.pop_back();

    // Exclude the current element
    subsetSumUtil(X, currSubset, result, target, currSum, index + 1);
}

std::vector<int> findSubsetSum(std::vector<int>& X, int y) {
    std::vector<int> result;
    std::vector<int> currSubset;
    subsetSumUtil(X, currSubset, result, y, 0, 0);
    return result;
}

int main() {
    std::vector<int> X = {3, 34, 4, 12, 5, 2};
    int y = 9;

    std::vector<int> subset = findSubsetSum(X, y);
    
    if (!subset.empty()) {
        std::cout << "Subset with sum " << y << " exists: ";
        for (int num : subset) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    } else {
        std::cout << "No subset with sum " << y << " exists." << std::endl;
    }

    return 0;
}

结果:


总结

在考虑PARTITION问题的变种,即找出和等于给定整数y的X的子集Y时,可以使用回溯法来解决。算法的思路是通过搜索所有可能的子集组合,尝试包含或排除每个元素,直到找到合适的子集使得和等于给定整数y。算法的时间复杂度可能为指数级的O(2^n),因为需要搜索所有可能的子集。需要注意的是,回溯法的时间复杂度通常较高,特别是在面对大规模输入时。因此,在实际应用中需要考虑性能问题,并且可能需要对算法进行优化或者考虑其他更高效的解决方案。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字母的大小写转换

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;字符串对象提供了lower()方法和upper()方法进行字母的大小写转换&#xff0c;即可用于将大写字母转换为小写字母或者将小写字…

怎样清理Mac存储空间 苹果电脑内存不够用怎么办 苹果电脑内存满了怎么清理

在使用 Mac 电脑的过程中&#xff0c;用户经常会遇到磁盘空间不足的困扰&#xff0c;这时候就需要寻找有效的方法来清理苹果电脑内存了。 清理Mac存储空间可以通过多种方法进行&#xff0c;以确保你的Mac能够高效运行并释放宝贵的存储空间。以下是一些有效的清理和优化方法&am…

【包装类简单认识泛型】

目录 1&#xff0c;包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 2&#xff0c;什么是泛型 3&#xff0c;引出泛型 3.1 语法 4&#xff0c;泛型如何编译的 4.1 擦除机制 4.2 为什么不能实例化泛型类型数组 5&#xff0c;泛型的上界 5.1 语法 5.2 复杂示例…

【数据结构】探索树中的奇妙世界

专栏介绍&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累…

521源码-免费源码下载-免费学习网站教程-宝塔面板ssl网站证书到期后弹出无法续期错误提示

宝塔面板如果从老版本升级到8.10后&#xff0c;当点站证书过期续期时会弹出错误&#xff1a; 排查文件是找不到问题出在哪里&#xff0c;导致续期错误。 解决办法&#xff1a;通过摸索&#xff0c;最简单的就是删除站点&#xff0c;注意&#xff1a;只是删除&#xff0c;不是把…

【Text2SQL 论文】评估 ChatGPT 的 zero-shot Text2SQL 能力

论文&#xff1a;A comprehensive evaluation of ChatGPT’s zero-shot Text-to-SQL capability ⭐⭐⭐⭐ arXiv:2303.13547 这篇论文呢综合评估了 ChatGPT 在 zero-shot Text2SQL 任务上的表现。 dataset 使用了 Spider、Spider-SYN、Spider-DK、Spider-Realistic、Spider-CG…

三步问题 | 动态规划

1.三步问题 题目连接&#xff1a;面试题 08.01. 三步问题 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 2…

高并发项目-用户登录基本功能

文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式&#xff08;不安全&#xff09;2.改进方式&#xff08;两次加密加盐&#xff09; 2.密码加密功能实现1.pom.…

5.29_Java程序流程控制

CSDN 同C语言的流程同 1、补充&#xff1a; 1、switch使用时的注意事项 1、表达式只能是byte、short、int、char&#xff0c;JDK5开始支持枚举&#xff0c;JDK7开始支持String、不支持double、float、long switch里面是做分支匹配&#xff0c;也就是可以出现很多分支&am…

【SPSS】基于因子分析法对水果茶调查问卷进行分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Python】解决Python报错:TypeError: can only concatenate str (not “int“) to str

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

P2341 受欢迎的牛

题目描述 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛&#xff0c;给你 M 对整数&#xff0c;表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的&#xff0c;如果 A 认为 B 受欢迎&#xff0c;B 认为 C 受欢迎&#xff0c;那么牛 A 也认为牛 C 受欢迎。你的任务是…

058.最后一个单词的长度

题意 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输…

开抖店必须要办理营业执照吗?不用营业执照开店的个人店能用吗?

大家好&#xff0c;我是电商花花。 可能大家都发现了&#xff0c;抖音小店个人店不用营业执照&#xff0c;只凭借身份证就能开店。 但是这个个人店花花并不建议大家去开&#xff0c;虽然说用用身份证也能开店&#xff0c;有效的帮我们减少了开店的成本&#xff0c;但是个人店…

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比较简单&#xff0c;就一个异或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要输入九个数&#xff0c;然后进入处理和判断&#xff0c;如果满足条件则进入输出flag部分&#xff0c;flag和输入有关&#xff0c;所以要理解需要满足什么…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

GPT-4o:人工智能新纪元的开端

引言 近年来&#xff0c;人工智能领域的发展日新月异&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;各种生成预训练模型不断推陈出新。自OpenAI发布GPT-3以来&#xff0c;生成预训练模型在文本生成、语言理解等任务中展现了强大的能力。近期&a…

MVC和MVVM

MVC Model层&#xff1a;用于处理应用程序数据逻辑的部分&#xff0c;通常负责在数据库中存取数据 View&#xff08;视图&#xff09;处理数据显示的部分。通常视图是依据模型数据创建的 Controller&#xff08;控制器&#xff09;是处理用户交互的部分。通常控制器负责从视…

Orange Pi Kunpeng Pro测评

#创作灵感# 参加树莓派鲲鹏开发版的测评活动&#xff0c;也想体验一下该开发版&#xff0c;之前有做过树莓派和香橙派的开发&#xff0c;刚好借此机会了解一下鲲鹏&#xff0c;所以就有了这篇测评文章。 #正文# 引言 说是测评&#xff0c;其实也没有多少测评方面的内容&…