朴素搜索dfs, 简单的剪枝搜索

为做一个项目选择最合适的语言固然重要,但是,掌握一门自己熟练的兵器,也很重要。

=====================================================================================================================

继续总结搜索类的题目,这一类的题目,目前仅分析简单粗暴的dfs搜索,以及简单的剪枝。

参考的题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1864
http://acm.hdu.edu.cn/showproblem.php?pid=1881

对于pid=1864,最大报销额的题目。细节部分很多,修改了很久才正确。

核心部分,加了搜索剪枝的:

void cal(int t ,double money ,double remain)
{
	if( t >= len)
	{
		if( money > max) max = money;//更新最大值
		return ;
	}
	if( money + remain <max) return ;  //如果剩下的钱加上现有的钱 都达不到max,那么永远都达不到max, 所以直接返回
	cal(t+1, money, remain-mon[t]);    //先不要这张发票
	if( money + mon[t] <=q)<span style="white-space:pre">		</span>  //满足条件,要这张发票
		cal(t+1, money+mon[t], remain- mon[t]);

}

对于pid=1881,毕业bg的题目,要想到先排序,再处理数据,有选择的处理的问题。

核心部分是朴素的搜索dfs:

void dfs(int i, int h, int time)
{
	if(i >= n)
	{
		if( h > max) max = h;
		return ;
	}
	dfs(i+1, h, time);
	if( bg[i].l + time <= bg[i].t)
		dfs(i+1, h + bg[i].h,  bg[i].l + time);
}

依旧上一个剪枝的版本,也可以ac只是时间变长了。或许是我剪枝的方式不对,要么就是这道题的数据剪枝反而效果不好。因为之前已经排序了。

void dfs(int i, int h, int time,int remain)//增加了数据的传输,以及比较
{
	if(i >= n)
	{
		if( h > max) max = h;
		return ;
	}
	if( h + remain < max) return;
        dfs(i+1, h, time, remain - bg[i].h);
	if( bg[i].l + time <= bg[i].t)
		dfs(i+1, h + bg[i].h,  bg[i].l + time, remain - bg[i].h);

}

朴素搜索dfs, 简单的剪枝搜索

时间: 2024-08-10 10:40:08

朴素搜索dfs, 简单的剪枝搜索的相关文章

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

Dearboy&#39;s Puzzle (poj 2308 搜索 dfs+bfs)

Language: Default Dearboy's Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1202   Accepted: 208 Description Dearboy is a game lover. Recently, he loves playing the game Lian Lian Kan. This game is played on a board with N*M grids

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

HDU 1078 FatMouse and Cheese 简单记忆化搜索

题意是:给你n和k,一个老鼠从左上角开始走,每次可以往一个方向走1~k中的任何一个值,但是每一步必须比前一步的值大,问获取的最多的值是多少? 简单记忆化搜索,dp[i][j]表示当前位置能获取的最大值,但是要注意,考虑全所有的情况才能用记忆化搜索,只要没有后效性,所有dfs,我觉得理论上都能用记忆化搜索. #include <cstdio>#include <iostream>#include <vector>#include <cmath>#include

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

深度搜索DFS!

好的,接下来就是本萌新的第一篇博客啦.直接上深搜!深度优先搜索(Depth-First-Search),简称“深搜”(dfs),是我们蒟蒻们最基本的搜索操作之一.简单地说,深搜就是递归.下面是抄来的解释:深度优先搜索用一个数组存放产生的所有状态.(1) 把初始状态放入数组中,设为当前状态:(2) 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态:(3) 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态:(4) 判断当前状态是否为目标状态,如果是目

[转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上,组成适合需求的Sharepoint搜索场,搜索场的体系结构设计主要参考量是爬网内容量,微软根据爬网内容量不同将搜索场分为大型场,中型场和小型场,更多详细信息可参考: SharePoint Server 2013 中的搜索概述和在SharePoint Server 2013 中规划企业搜索体系结构.

[ACM] poj 1088 滑雪 (记忆化搜索DFS)

求n*m网格内矩形的数目[ACM] poj 1088 滑雪 (记忆化搜索DFS),布布扣,bubuko.com