【回溯法】子集合问题

简介: 【回溯法】子集合问题

 一、题目描述:

【问题描述】子集和问题的一个实例为<S,M>。其中S={x1,x2,…,xn}是一个正整数的集合,M是一个正整数。找出S的所有子集S1,使得S1中所有元素的和为M。试设计一个解子集和问题的回溯法。

【样例输入】

5 10 12 13 15 18

30

【样例输出】

5 10 15

5 12 13

12 18

【样例说明】输入第一行是集合S,第二行是整数M;输出每一行代表一个解

二、设计思想

1、方法:递归+回溯

2、递归:back(i) 中含 back(i+1)

    回溯:不放第i元素,继续 back(i+1)

3、back(i)主体:

     (1)、if(i>n || Sum>SumFlag ||Num[i]>SumFlag) return; 跳出

     (2)、满足条件,打印

     (3)、放入第i元素,back(i+1)递归

                  Sum=Sum-Num[i];//回溯

                  不放入第i元素,back(i+1)递归

三、代码如下:

#include <bits/stdc++.h>
#define N 100000
using namespace std;
int n=6;//集合中元素个数
int Sum=0;//存目前计算的元素和 
int SumFlag=0;//SumFlag值为所需求的元素和
int Num[N];//集合的元素 
bool flag[N];//flag[i]=true表示放入计算,flag[i]=false表示未放入计算 
void back(int i){
  if(i>n || Sum>SumFlag ||Num[i]>SumFlag) return;//穷尽元素数组或者和大于SumFlag,跳出
  //数组存储有数据的i最大值为n-1,将其放入flag数组为一次操作
  //若其放入后,存储的元素满足题意,执行打印为一次操作使i=n
  //跳出为一次操作使i=n+1
  //所以此次判断为i>n,而不是i>n-1 
  else if(Sum==SumFlag){//满足条件,输出 
    for(int i=0;i<n;i++){
      if(flag[i]){
        cout<<Num[i]<<" ";
      }
    }
    cout<<endl;
  }
  else{
    Sum=Sum+Num[i];
    flag[i]=true;//第i元素加入满足条件的元素组 
    back(i+1);//递归  
    Sum=Sum-Num[i];//回溯 
    flag[i]=false;//第i元素不加入满足条件的元素组
    back(i+1);//递归   
  } 
}
int main(){   
  for(int i=0;i<n;i++){//输入元素值 
    cin>>Num[i];
    flag[i]=false;//将其对应的flag[i]设置为false 
  }
  cin>>SumFlag;//SumFlag值为所需求的元素和
  back(0);
  return 0;
}

image.gif

四、示例

1、示例输入:

5 10 12 13 15 18
30
image.gif

2、示例输出:

5 10 15
5 12 13
12 18
image.gif


目录
相关文章
|
8月前
|
供应链 算法 量子技术
量子跃迁:量子计算在物流优化中的革命性应用
量子跃迁:量子计算在物流优化中的革命性应用
558 22
|
6月前
|
存储 前端开发 搜索推荐
内容,内容资产,以及内容即服务
内容是指在媒体、平台或者其他载体上所呈现的信息、文章、图片、视频、音频等形式的表达。内容可以是有关某个特定主题或领域的知识、观点、故事、娱乐等,通过文字、图像、声音等方式传达给用户或观众。在互联网时代,内容的重要性越来越突出,各种网站、应用和社交媒体平台都以提供优质内容为目标,吸引用户关注和参与。
293 3
|
SQL 存储 数据安全/隐私保护
MyBatis-Plus演绎:数据权限控制,优雅至极!
项目使用mybaits-plus,所以在mybaits-plus的基础上增加数据权限的过滤 mybaits-plus自带数据权限支持,但由于系统数据权限相对复杂,通过查看文档发现好像并不适用,且原项目版本低,所以最终还是通过自己的方式实现
1820 1
MyBatis-Plus演绎:数据权限控制,优雅至极!
|
11月前
|
网络虚拟化
配置BGP/MPLS IP VPN示例
本文介绍了通过配置MPLS VPN实现分部与总部之间的通信需求。具体要求为分部1和分部2只能与总部通信,而分部之间不能通信。配置思路包括使用BGP协议传递路由,并将各分部分别划分到不同的VPN实例中(VPN1、VPN2、VPN3),通过设置RD和Target属性确保路由隔离。操作步骤涵盖设备IP地址配置、MPLS域内互通、PE上的VPN实例配置、接口绑定、MP-IBGP配置、CE与PE间的路由交换及MPLS LDP功能配置。最终验证显示,同一VPN内的CE设备可以相互通信,不同VPN的CE设备则无法通信,满足了组网需求。
配置BGP/MPLS IP VPN示例
|
10月前
|
人工智能 前端开发 搜索推荐
研发智能化新篇章:通义灵码企业级方案与实践
《研发智能化新篇章:通义灵码企业级方案与实践》简介: 本文探讨了通义灵码在提升企业研发效能方面的核心影响和实际应用。首先分析了AIGC(人工智能生成内容)如何从个体效率、协同效率和持续化三个维度提升企业生产力。接着,通过亚信科技的实际案例,展示了其在不同场景下的智能化实践,包括智能编程助手的选型、部署及效果评估。最后,展望了未来研发智能化的发展方向,提出构建覆盖软件开发全流程的智能体工具集,以进一步降低使用门槛并提升整体效率。文中强调了通义灵码在代码补全、知识问答等方面的应用成效,并指出了企业在落地过程中面临的挑战及应对策略。
444 1
|
存储 关系型数据库 Linux
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
|
人工智能 自然语言处理 算法
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
722 9
|
存储 弹性计算 数据库
2024最新阿里云优惠券领取入口整理、代金券查询方法和使用教程
2024最新阿里云优惠券领取入口整理、代金券查询方法和使用教程。阿里云优惠券是什么?2024年阿里云优惠券领取地址链接和使用方法。阿小云连夜整理阿里云优惠券领取入口,包括领券中心、学生无门槛300元代金券、域名优惠口令、代金券查询和使用方法
1536 7
|
存储 JavaScript 前端开发
HarmonyOS应用开发者基础认证考试(95分答案)
HarmonyOS应用开发者基础认证考试(95分答案)
9896 0