[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个 ...
随机推荐
- file_put_contents生成ansi文件
$line_body = array('张三','李四','王五'); $line_body = array_map(function ($element){return iconv('UTF-8', ...
- 工作技术点小计14条 hybrid + animate 方向
设置transition 动画的时候 , js直接设置duration 和 变化值不会起作用 , 需要先设置duration , 等一小会再设置变化值 安卓端 , 窗口不可见时 , window.in ...
- C++冒险攻略(持续更新中。。。)
C++语言程序设计 我的C++冒险之旅 绪论 计算机系统基本概念 计算机硬件 计算机程序语言 计算机解决问题是程序控制的 程序就是操作步骤 程序要使用语言来表达 机器语言 计算机能识别的是机器语言 机 ...
- CSS3新单位vw,vh,vmin,vmax详解
1,vw,vh,vmin,vmax是由视窗Viewport大小来决定的,单位1,代表1%,是一种相对单位,只要是为响应式适配视窗的一种解决方案: vw:view width(视窗宽度)的百分比,1vw ...
- 详细解析kafka之kafka分区和副本
本篇主要介绍kafka的分区和副本,因为这两者是有些关联的,所以就放在一起来讲了,后面顺便会给出一些对应的配置以及具体的实现代码,以供参考~ 1.kafka分区机制 分区机制是kafka实现高吞吐的秘 ...
- 为.net Core 3.0 WebApi 创建Linux守护进程
前言 我们一般可以在Linux服务器上执行 dotnet <app_assembly.dll> 命令来运行我们的.net Core WebApi应用.但是这样运行起来的应用很不稳定,关闭终 ...
- OpenMP Programming
一.OpenMP概述 1.OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型 2.包含 编译制导(compiler directive).运行库例程(runtime library). ...
- ggplot2(4) 用图层构建图像
4.1 简介 qplot()的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层.每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中. 一个图 ...
- tomcat Http11NioProtocol如何解析http请求及如何解决TCP拆包粘包
前言 tomcat是常用的Web 应用服务器,目前国内有很多文章讲解了tomcat架构,请求流程等,但是没有如何解析http请求及如何解决TCP粘包拆包,所以这篇文章的目的就是介绍这块内容,一下内容完 ...
- python3:input() 函数
一.知识介绍: 1.input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型: 2.可以用作文本输入,如用户名,密码框的值输入: 3.语法:input("提示信息:& ...