[vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159
https://www.luogu.org/problem/show?pid=1494
这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板,都是一些基础题,但是还是觉得自己不行啊。。。
拿到题目后我就有了一个大胆的想法
然后自己仔细斟酌之后我就pass了他。。。我原本想在dfs中来记录下有几种水桶,现在询问的是哪一个水桶,当前这个水桶选了几个。。。
然而,这个想法实在是太大胆了。。。。。。。在一番斟酌之后,我想到了一个神奇的东西叫记忆化搜索。。
这是神奇海螺告诉我的。。。对,没错,就是这个记忆化搜索。。。。
【思路】
记忆化的时候开一个数组f,f[i]表示水量i的时候能不能让水装满(或者说能不能满足题的条件),如果i能够减去我选出来的水桶并让肛♂里的水变成0.说明这个是可行滴
这也是这题里唯一需要注意的地方,这个记忆化处理实质上就是判断你选出的数能不能让水缸的水被桶接完
假如你只选了水桶3,水量变化16-13-10-7-4-1-狗带
假如选了水桶3和5,水量变化16-13-10-5-5-因吹斯听
可能这个地方有点抽象,所以要多多理解一下。。。。。。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<cmath>
#define maxn 20005
#define maxm 105
using namespace std; int v,m,ans,val[maxm],flag,a[maxm],f[maxn]; int comp(const void*a,const void*b)
{
return(*(int*)a)>(*(int*)b)?:-;
} int check(int n)
{
if(n==)return f[n]=;//如果可以把水装走
if(f[n]!=-)return f[n];//如果之前已经试过这么多水能不能装走
for(int i=;i<=ans;i++)
{
if(n>=a[i]&&check(n-a[i]))
return f[n]=;//成功装走,记录路径
}
return f[n]=;
} void dfs(int num,int sum)//第几种,有几种
{
if(sum==ans+)
{
memset(f,-,sizeof(f));
if(check(v))
{
flag=;
return ;
}
return;
}
if(flag==||num>m)return ;
a[sum]=val[num];
dfs(num+,sum+);//选第num个桶
dfs(num+,sum);//不选第num个桶,在接下来覆盖这一位
} int main()
{
scanf("%d%d",&v,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&val[i]);
}
qsort(val,m+,sizeof(int),comp);
if(val[]==){
printf("1 1");return ;
}else{ for(ans=;ans<=m;ans++)
{
dfs(,);
if(flag){
printf("%d ",ans);
for(int i=;i<=ans;i++)
printf("%d ",a[i]);
return ;
}
} }
}
小小总结:我记得我学迭代深搜的时候,是和着记忆化一起学的,然后从今天的几道题看,迭代深搜经常会和记忆化一起出现。。。以后做题的时候可以多往这个方向想,而不是一些大胆的想法
[vijos1159&洛谷1494]岳麓山上打水<迭代深搜>的更多相关文章
- [vijos1159]岳麓山上打水
[vijos1159]岳麓山上打水 试题描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. ...
- 【DFS】【DP】岳麓山上打水
[vijos1159]岳麓山上打水 描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信 ...
- P1159岳麓山上打水
P1159岳麓山上打水 https://vijos.org/p/1159 dfsID,第一次听说这东西,但是感觉不太靠谱啊. 一开始的时候,想到了排个序后,然后进行dp,如果要输出字典序最小其实还是可 ...
- vijosP1159 岳麓山上打水
vijosP1159 岳麓山上打水 链接:https://vijos.org/p/1159 [思路] 迭代加深搜索+完全背包判断. 自己没有思路,看的别人代码. 总体上讲就是不断增大桶的数目并以之为上 ...
- luogu P1494 岳麓山上打水
题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- 题解【Vijos1159】岳麓山上打水
题面 迭代加深搜索模板题. 注意开始时要先对桶的容量从小到大排序. 达到搜索层数时使用完全背包\(\text{check}\)即可. 具体实现参考代码. #include <bits/stdc+ ...
- luogu P1494 岳麓山上打水 [iddfs]
题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...
- 洛谷 P1008 三连击 Label:水
题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 输入输出格式 输入格式: 木有输入 输出格式: 若干行,每行3个 ...
随机推荐
- almost最好的Vue + Typescript系列02 项目结构篇
基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 p ...
- Linux系统简单文件操作命令
项目 内容 作业课程归属 班级课程链接 作业要求 作业要求链接 学号-姓名 17041419-刘金林 作业学习目标 1)学习Linux的基本操作命令:2)在终端上运用命令行去实现基本文件操作 1.查看 ...
- # 爬虫连载系列(1)--爬取猫眼电影Top100
前言 学习python有一段时间了,之前一直忙于学习数据分析,耽搁了原本计划的博客更新.趁着这段空闲时间,打算开始更新一个爬虫系列.内容大致包括:使用正则表达式.xpath.BeautifulSoup ...
- 什么是RPM
RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u ...
- 使用JavaScript策略模式校验表单
表单校验 Web项目中,登录,注册等等功能都需要表单提交,当把用户的数据提交给后台之前,前端一般要做一些力所能及的校验,比如是否填写,填写的长度,密码是否符合规范等等,前端校验可以避免提交不合规范的表 ...
- video 在iphone手机的ios系统和微信端无法自动播放
描述:video 在iphone手机,微信端无法自动播放,ios系统下不能自动播放视频.而且如果没有autoplay属性,在微信端点击一次,弹不出视频,要一直触着两秒后才可以打开视频.如果点击播放的话 ...
- 1.JVM中的五大内存区域划分详解及快速扫盲
本博客参考<深入理解Java虚拟机>这本书 视频及电子书详见:https://shimo.im/docs/HP6qqHx38xCJwcv9/ 一.快速扫盲 1. JVM是什么 JVM是 ...
- typescript package.json vscode 终端 运行任务 Ctrl shift B
{ "dependencies": { "typescript": "^3.6.4" } }
- Python基础篇(四)_组合数据类型的基本概念
Python基础篇——组合数据类型的基本概念 集合类型:元素的集合,元素之间无序 序列类型:是一个元素向量,元素之间存在先后关系,通过序号进行访问,没有排他性,具体包括字符串类型.元组类型.列表类型 ...
- 什么是Hibernate
Hibernate是一个基于JDBC的主流持久性框架,是一个优秀的ORM(object relation mapping)(对象关系映射)实现 ORM就是通过java对象映射到数据库表中,通过操作ja ...