子集和问题

2023-10-27

子集和问题
描述 Description
【问题描述】
  子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得子集S1和等于c。
【编程任务】
  对于给定的正整数的集合S={ x1, x2,…, xn}和正整数c,编程计算S 的一个子集S1,使得子集S1和等于c。
【输入格式】
  由文件subsum.in提供输入数据。文件第1行有2个正整数n和c,n表示S的个数,c是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。
【输出格式】
程序运行结束时,将子集和问题的解输出到文件subsum.out中。当问题无解时,输出“No Solution!”。
【输入样例】
5 10
2 2 6 5 4
【输出样例】
2 2 6

思路:
emmmmm,第一反应就是这个问题和求子集问题神似,用递归回溯来做,于是我就写了一个求子集的外加一个判定,最后超时了,然后再想觉得有点像01背包,于是我试着写了一个,发现动态方程我写不出来,因为这个是固定和,和01背包不一样,所以gg,然后我看了别人的想法,有个是用非递归回溯做的,这里贴一下代码:

#include<stdio.h>
#define MAX 10000
int data[MAX];
bool v[MAX];
int n, c;
bool traceback(int n) {
	int p = 0, sum = 0;
	while (p >= 0)
	{
		if (!v[p])
		{
			v[p] = true;
			sum += data[p];
			if (c == sum)
				return true;
			else if (c < sum)
			{
				v[p] = false;
				sum -= data[p];
			}
			p++;
		}
		if (p >= n)
		{
			while (v[p - 1])
			{
				p--;
				v[p] = false;
				if (p<1) return false;
			}
			while (!v[p - 1])
			{
				p--;
				if (p<1) return false;
			}
			sum -= data[p - 1];
			v[p - 1] = false;
		}
	}
	return false;
}
int main() {
	scanf("%d %d", &n, &c);
	for (int i = 0; i < n; i++)
		scanf("%d", &data[i]);
	if (traceback(n))
	{
		int first = 1;
		for (int i = 0; i < n; i++)
			if (v[i])
			{
				if (first)
					first = 0;
				else
					printf(" ");
				printf("%d", data[i]);
			}
		printf("\n");
	}
	else
		printf("No Solution!\n");
	return 0;
}

解释:它的思想是,从第一个元素开始,如果此时当前的元素不在集合内的话,将这个元素加到子集当中来(用visited数组标记) ,将sum加上这个元素的值。然后判断如果sum恰好为目标值c的话,就返回正值并且打印结果。如果sum > c 的话则舍弃当前这个元素,修改标记数组,并且将sum减去这个元素的值。只要还有元素没有判断就继续选择。直到第n个元素,如果第n个元素判断完还没有找到解的话,就回溯到上一次选择的那个点,将其从集合里面删除并从它后一个点继续重复前面的操作。如果回溯的时候回溯到了第一个元素之前的话呢,表示这个时候要么所有元素都加入到集合都不够,或者是所有的情况都找过了还是没有解决方案,这个时候返回无解。
摘自:http://blog.sina.com.cn/s/blog_7865b083010100dd.html

----------------------------------------------2018.3.10更新-------------------------------------------

這从我用了背包的想法又把这个题做了一遍,因为找不到之前 的题目了,所以就自己简答的测了几组数据,如果大家有发现我的错误,请务必指正,谢谢.
思路:
我之前就在想这个提和01背包神似,所以我就一直想用01来做,一直被困在如何输出,我输出所有的表之后发现,从最后一位每次往上一个状态推就可以找到一个符合题目要求的解。
代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 1024;
int dp[MAX][MAX];
int p[MAX];
int n,m;
int main(void) {
	cin >> m >> n;
	for (int i = 1; i <= m; i++)
		cin >> p[i];
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			dp[i][j] = (i == 1 ? 0 : dp[i - 1][j]);
			if (j >= p[i]) {
				dp[i][j] = max(dp[i][j], dp[i - 1][j - p[i]] + p[i]);
			}
		}
	}
	for (int i = 0; i <= m; i++) {//打印所有关系表格
		for (int j = 0; j <= n; j++) {
			cout << dp[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	for (int i = m; i > 0; i--) {//从最后一位往前获取
		for(int j=0;j<=n;j++){
			if (dp[i][n] - p[i] == dp[i - 1][j]) {
				cout << p[i] << " ";
				n = j;
			}
		}
	}
	system("pause");
	return 0;
}

这里写图片描述

----------------------------------------------2019.8.30更新-------------------------------------------
突然诈尸看了博客发现有留言说第一份代码不对,测试了发现还真的有问题,但当时oj直接ac了,可能是oj的测试点太少没有囊括这种情况,所以又想了下,我认为是在回溯的时候,sum和没有减去当前值,导致的最后求得序列不对,因此解决办法是在第29行后面插入一句,意思是如果当前点是访问过的,将其访问位置为未访问并且sum减去当前下标为访问点的data值。

if(p>1)sum-=data[p];

这是我目前想到的解决办法,然后自己测试了几组数据发现没什么毛病,如果有老铁发现还有错误请指出来,我会继续改进这份代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子集和问题 的相关文章

  • matlab rbf手写

    clc clear format long trainD 0 0 1 10 outD sin trainD trainD outD outD dnum length trainD 初始化参数学习率 lr w0 0 1 权值 lr c0 0
  • pip install mysqlclient报错

    安装mysqlclient时报错 先查看安装的python版本 python V 根据版本下载下载对应的 mysqlclient 文件 https www lfd uci edu gohlke pythonlibs mysqlclienth
  • 将本地项目上传到Github

    下次不要再忘了 虽然一直都在使用Github 但是经常不常用命令行都容易忘记掉 特意在此进行一次记录 1 在GitHub创建一个项目 2 在本地文件夹中 做一次Git初始化 Aliyun alioss 17 27 15 git init I
  • dw本地文件传不到远程服务器,用DW上传站点 怎么设置远程服务器

    用DW上传站点 怎么设置远程服务器 内容精选 换一换 本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器 已在待上传文件的云服务器中搭建 FTP 服务 如果您的云服务器为 Windows 操作系统 具体操作请参
  • PPPoE报文格式及交互详解

    简介 PPPoE报文的格式就是在以太网帧中携带PPP报文 如图所示 各个字段解释如下 Destination address 一个以太网单播目的地址或者以太网广播地址 0xffffffff 对于Discovery数据包来说 该域的值是单播或
  • 二叉搜索树 (BST) 的插入, 删除, 查找

    文章目录 二叉搜索树 BST 的定义 缺点 BST 的构建 BST 的插入 BST 的查询 BST 的删除 BST 的检验 二叉搜索树 BST 的定义 二叉搜索树 Binary Search Tree 的结点定义一般如下 typedef s
  • 数据仓库(3)数仓建模之星型模型与维度建模

    维度建模是一种将数据结构化的逻辑设计方法 也是一种广泛应用的数仓建模方式 它将客观世界划分为度量和上下文 度量是常常是以数值形式出现 事实周围有上下文包围着 这种上下文被直观地分成独立的逻辑块 称之为维度 它与实体 关系建模有很大的区别 实
  • Python人脸检测实战之疲劳检测

    本文主要介绍了实现疲劳检测 如果眼睛已经闭上了一段时间 我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意 感兴趣的朋友可以了解一下 今天我们实现疲劳检测 如果眼睛已经闭上了一段时间 我们会认为他们开始打瞌睡并发出警报来唤醒他们并
  • c语言编程函数名:b开头

    函数名 bar 功 能 画一个二维条形图 用 法 void far bar int left int top int right int bottom 程序例 include
  • LaTeX快速入门(超详细~)

    文章目录 LaTeX快速入门 前言 1 LaTeX源文件的基本结构 2 LaTeX中的中文处理方法 3 字体字号设置 3 1 字体族设置 3 2 字体系列设置 粗细 宽度 3 3 字体形状设置 3 4 中文字体设置 3 5 字体大小设置 4
  • vscode 添加全局宏定义

    问题 利用vscode编辑代码时 设置了禁用非活动区域着色后 在一些编译脚本中配置的宏又识别不了 遇到 ifdef包住的代码就会变暗色 想查看代码不是很方便 如下图 解决 在vscode中添加全局宏定义 步骤 1 ctrl shift p
  • 课时 6 自测题

    通过 Deployment 不能实现以下功能 单选题 A 应用扩缩容 B 应用发布回滚 C 应用重启 D 应用副本数量维持 一个 Deployment 中 哪些 labels selector 必须一致 单选题 A deployment L
  • 微信小程序首页数据初始化失败的解决方法

    一 问题描述 用户首次后再次进入小程序时 我们通常需要通过获取用户openid或unionid用作唯一标示与后台进行数据交流 初始化用户信息 当我们通过第三方服务器跟微信建立请求时 微信需要用户确认是否公开信息 如图1 从console可以
  • ARM中CPSR的标志位中的C和V

    进位标志和溢出标志 这次大概总结一下进位标志 Carry Flag CF 和溢出标志 Overflow Flag OF 的含义和理解方式 首先明确一点基本认识 处理器本身并不在意也不知道参与算术运算或者逻辑运算的操作数是有符号的还是无符号的
  • 工具类篇-07-往Linux服务器上传文件工具类

    文章目录 1 依赖 2 FTPUtil 1 依赖
  • 光子晶体激光器

    1 分布式反馈DFB 2 布拉格反射DBR 转载于 https www cnblogs com Iknowyou p 7536991 html
  • Linux 网络通信C/S、TCP/IP、Socket 最全详解( 9 ) -【Linux通信架构系列 】

    系列文章目录 点击进入系列文章总目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now ever
  • html文件如何做成链接,如何将文件做成超链接HTM网页?

    回答 首先先将插入点置于所需插入超链接位置 或选中一个要作为超链接显示的对象 如文本 图片等等 例 将Word文档的文字链接到一张图片 请点击输入图片描述 选中需要链接的文字 鼠标右键点击 超链接 选项 或者点击菜单栏的 插入 超链接 即可

随机推荐

  • 【赠书活动|第三期《Spring Cloud Alibaba核心技术与实战案例》】

    文章目录 特色 内容简介 作者简介 抽奖方式 本期中奖者 特色 不留遗漏 全面覆盖Dubbo核心知识点 直击要害 实战化案例精准定位技术细节 学以致用 精要式演示确保开发 学习不脱节 潜移默化 研磨式知识讲解渗透技术要点 提升效率 垂直式技
  • ore than one file was found with OS independent path 'META-INF/androidx.localbroadcastmanager_localb

    项目 build gradle 的 android节点下新增 packagingOptions exclude META INF androidx localbroadcastmanager localbroadcastmanager ve
  • CVPR无监督/自监督学习(Un/Self-supervised Learning)方向论文学习(附摘要)

    目录 2022CVPR UniVIP A Unified Framework for Self Supervised Visual Pre training 自监督学习 Crafting Better Contrastive Views f
  • larvel 生命周期理解

    参考 https www jianshu com p 08b810b720d9 不能理解服务器容器的强烈推荐这位大佬写的 https www cnblogs com JdsyJ p 12670497 html 今天学习下laravel的生命
  • 星图按转化线索回传对接思路与示例

    一 什么是星图 二 什么是线索转化 三 对接中的一些疑问 四 如何对接开发 五 星图侧如何联调测试 一 什么是星图 抖音星图是抖音电商蓝图下 为品牌方 MCN公司和明星 达人服务并收取分成 在这可以实现订单接收 签约管理 项目汇总 数据查看
  • 数值模拟使用matlab实现案例

    好的 我来为您讲解如何使用MATLAB来进行数值模拟 首先 您需要安装并打开MATLAB软件 然后 您可以在MATLAB的命令窗口中输入您要模拟的数学方程 并使用MATLAB的内置函数和符号进行运算 例如 如果您想对于y x 2进行模拟 您
  • 探索图像处理的利器——OpenCV

    目录 引言 一 OpenCV简介 二 OpenCV的特点 三 OpenCV的应用领域 四 实际案例 结论 引言 在当今信息化的时代 图像处理已经成为了日常生活中不可或缺的一部分 从社交媒体滤镜到自动驾驶系统 图像处理技术的广泛应用正在改变着
  • OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合

    OpenCV Mediapipe手势动作捕捉与Unity引擎的结合 前言 Demo演示 认识Mediapipe 项目环境 手势动作捕捉部分 实时动作捕捉 核心代码 完整代码 Hands py py代码效果 Unity 部分 建模 Unity
  • C语言编程技巧 --- C语言中左移右移与乘除法的比较

    C语言中右移与除法的比较 最近在做项目的时候 遇到了一个有趣的现象 那就是 对于除2的整数次幂的操作而言 为了加快计算速度 一般情况下 会用右移 gt gt 来替代除法 但实际上 在VS中 右移等价于matlab中的floor 地板 操作
  • 登录认证功能的统一拦截技术(过滤器)

    目录 1 前言 2 过滤器 1 说明 2 使用步骤 3 说明示例 4 具体示例 5 过滤器详细说明 3 登录校验的过滤器实现 1 实现流程 2 具体实现 1 前言 前端发起请求 每次都会在请求头中携带JWT令牌到服务端 而服务端需要统一拦截
  • JSON.PARSE() 出现UNEXPECTED END OF JSON INPUT原因是什么怎么解决

    原因 打印出来的数据当中为判断题时数据是空的 当使用JSON parse字符串转数组时 如果里面数据有空 那么就会报错 做一个判断就好了 有才取值 if value var fileList JSON parse value else va
  • zTree 树插件实现全国五级地区点击后加载

    在项目功能中需要录入户籍地和现居住地 为减少用户输入量 将使用树插件选择全国五级地区 输入框输入详细地址 这里优先使用了zTree树插件 为了以后使用学习 在这里进行相关记录 当然在实现过程中参考各大神的文章是必不可少的 可以结合了自己的实
  • RS485利用地址主动仲裁驱动

    源码下载 MAX485 主动竞争驱动 rar C文档类资源 CSDN下载 引入背景 最近在工作中使用了RS485协议 之前虽然知道怎么用 但是实际应用到工程上还是第一次 在使用过程中就涉及到RS485总线的一些架构问题 我们都知道 RS48
  • [carla]关于odometry坐标中的角度坐标系 以及 到地图的映射问题

    1 获取车辆的Odometry原始信息 在carla中 通过订阅 carla ego vecle odometry 可以查看车辆的全局位置信息 例如 gt header seq 118872 stamp secs 5946 nsecs 57
  • C++ 二维数组vector如何添加空行

    在制作BP神经网络时 需要给vector添加一个空行 自己根据直觉进行了以下试探 发现并没有问题 include
  • C++析构函数的自动调用问题

    首先要明确一点 系统只会自动释放栈内空间 而堆内空间需要用户自己维护 C 中 除了new来的空间存放在堆内 其他均存放在栈中 当单纯的创建对象的时候 对象存放在栈中 此时在程序块的 后面 系统会自动调用析构函数 释放掉栈空间 但是 如果创建
  • 简述浏览器渲染流程

    近期的项目涉及到了前端的一系列知识 所以就简单的总结一下 因为不是前端人员 相关的概念可能不会分析的很深 如果说法有问题 希望路过的大佬们多多指教 下面说的大多是自己的理解 尽可能简洁又通俗 说到浏览器渲染 一个重要前提应该就是dom do
  • Ubuntu启动ftp服务

    Ubuntu启动ftp服务 1 安装vsftpd sudo apt get install vsftpd 2 修改ftp配置文件 注意要加sudo 否则无权限更改 sudo vi etc vsftpd conf 将 local enable
  • MySQL数据库入门实战教程

    目录 前言 一 创建建数据库 创建建数据表 查看数据库 查看数据表 二 新增 修改 删除表记录 三 基础查询 where子句查询 1 基础查询 2 WHERE子句查询 3 Like模糊查询 四 分组查询 聚合函数 排序查询 4 排序查询 5
  • 子集和问题

    子集和问题 描述 Description 问题描述 子集和问题的一个实例为 S t 其中 S x1 x2 xn 是一个正整数的集合 c是一个正整数 子集和问题判定是否存在S的一个子集S1 使得子集S1和等于c 编程任务 对于给定的正整数的集