深度优先搜索DFS---最优子序列求和问题(1)
题目:
给定N 个整数(可能有负数),从中选择 K个数,使得这 K个数之和恰好等于一个给定的整数 X;如果有多种方案,那么选择它们中元素平方和最大的一个。例如,从4个整数{ 2, 3, 3 ,4}中选择 2个数(集合中的每一个数只能被选一次),使它们的和为 6。显然有两种方案{2,4}和{3, 3},其中平方和最大的方案为{2, 4}。数据保证存在且唯一。
输入格式:
第一行给出 一个正整数 N( 1<=N<=20)
第二行给出N个整数(可能有正有负,可能不按数的大小顺序给出),中间以空格隔开。
第三行给出选择元素 K个数 ,以及它们的和 X
输出格式:
按递增的方式输出序列。
输入样例:
4 //4个元素
2 3 3 4 //4个元素的值
2 6 //选择 2个元素,之和为 6
输出样例
2 4
直接给出代码。
自我规定:当有多个递归边界时,通常把”判断是否是答案“的条件作为递归边界一。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; const int maxn = ;
int A[maxn] = {};
int n,k,x,maxSumSqu= -;
vector<int> temp,ans;
void DFS(int index, int nowK,int sum,int sumSqu) {
if(nowK == k && sum == x) {//递归边界一
if(maxSumSqu < sumSqu) {
maxSumSqu = sumSqu;
ans = temp; //vector之间等号赋值,仅限 Int
}
return ;
}
if(index == n || nowK > k || sum > x) return ;//递归边界二
temp.push_back(A[index]);
DFS(index+,nowK+1,sum+A[index],sumSqu+A[index]*A[index]); //"选择"index号数
temp.pop_back();
DFS(index+,nowK,sum,sumSqu);//"不选择"index号数
} int main() {
cin>>n;
for(int i = ; i < n; ++i)
cin>>A[i];
cin>>k>>x;
DFS(,,,);//初始参数一般都为 0
sort(ans.begin(),ans.end());
for(int i = ; i < ans.size(); ++i) {
if(i > ) printf(" ");
printf("%d",ans[i]);
}
return ;
}
运行结果:
题目修改:
假设 N个整数中的每一个都可以被选择多次,那么选择 K个数,使得 K个数之和恰好为X。
只需修改一处代码即可,那么可以持续选择index号数,直至不再选择index号数,再转入“不选index号数”的分支。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; const int maxn = ;
int Set[maxn] = {};
int n,x,sum,MAXSqu= -;
vector<int> temp,ans;
void DFS(int index, int nowX,int nowSum,int nowSqu) {
if(nowX == x && nowSum == sum) {//递归边界一
if(MAXSqu < nowSqu) {
MAXSqu = nowSqu;
ans = temp; //vector之间等号赋值,仅限 Int
}
return ;
}
if(index == n || nowX > x || nowX > sum) return ;//递归边界二 temp.push_back(Set[index]);//保存当前元素
DFS(index, nowX+,nowSum + Set[index],nowSqu +Set[index]*Set[index]);//“选择”当前 index号数
temp.pop_back();
DFS(index + ,nowX,nowSum,nowSqu); //“不选择”当前 index 号数
} int main() {
cin>>n;
for(int i = ; i < n; ++i)
cin>>Set[i];
cin>>x>>sum;
DFS(,,,);
sort(ans.begin(),ans.end());
for(int i = ; i < ans.size(); ++i) {
if(i > ) printf(" ");
printf("%d",ans[i]);
}
return ;
}
深度优先搜索DFS---最优子序列求和问题(1)的更多相关文章
- 深度优先搜索 DFS 学习笔记
深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- 用深度优先搜索(DFS)解决多数图论问题
前言 本文大概是作者对图论大部分内容的分析和总结吧,\(\text{OI}\)和语文能力有限,且部分说明和推导可能有错误和不足,希望能指出. 创作本文是为了提供彼此学习交流的机会,也算是作者在忙碌的中 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- 算法总结—深度优先搜索DFS
深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...
- HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...
- [LeetCode OJ] Word Search 深度优先搜索DFS
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
随机推荐
- javabst1an
(单选题)下列概念中不包括任何实现,与存储空间没有任何关系的是() A)类 B)接口 C)抽象类 D)对象 正确答案为:B解析:接口是一种只含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现 ...
- Java原子变量类需要注意的问题
在学习多线程时,遇到了原子变量类,它是基于 CAS 和 volatile 实现的,能够保障对共享变量进行 read-modify-write 更新操作的原子性和可见性.于是我就写了一段代码试试,自认为 ...
- Codeforces 1188B Count Pairs (同余+分离变量)
题意: 给一个3e5的数组,求(i,j)对数,使得$(a_i+a_j)(a_i^2+a_j^2)\equiv k\ mod\ p$ 思路: 化简$(a_i^4-a_j^4)\equiv k(a_i-a ...
- RocketMQ重试机制和消息幂等
一.重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动,服务宕机,程序异常因素,很有可能出现消息发送或者消费失败的问题.因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点.如果没有消息重 ...
- Go语言实现:【剑指offer】二叉树的深度
该题目来源于牛客网<剑指offer>专题. 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. Go语言实现: /** ...
- Dockerfile的使用
一 什么是Dockerfile Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像. 1.对于开发人员:可以为开发团队提供一个完全一致的开发环境: 2.对 ...
- Thingsboard源码安装部署
交流QQ群 如果安装有其他问题,可以到QQ群求助 环境安装 开发环境要求:Jdk 1.8版本Postgresql 9以上Node.jsNpmMaven 3.6以上Git工具Idea开发工具 JDK 下 ...
- mysql ---- Host '' is not allowed to connect to this MySQL server
mysql>use mysql mysql>update user set host= '%' where user = 'root'; 此时如果提示报错,不用管,继续往下走 select ...
- 如何清理ibdata1
1, 加锁,然后全备份数据,可以用mysqldump,也可以使用其他的工具: [root@localhost data]# mysqldump --all-databases > /root/a ...
- 2014.1.21 DNS大事故(dns原理、网络封锁原理)
1.21那天发生了什么,由1.21联想补充…… 很多网站都上不去,域名解析都到了65.49.2.178这个IP地址 先科普,再深挖 dns查询类型 递归查询,迭代查询 DNS解析过程,这里使用 ...