搜索树

剪枝方法

1.优化搜索顺序

2.排除等效冗余

3.可行性

4.最优性(估价)

5.记忆化(树形不会重复计算时不需要)

A.针对每个维度边界信息缩放、推倒

B.计算未来最少花费

C.结合各维度的联系

P1120 小木棍 

https://www.luogu.org/problemnew/show/P1120

bool dfs(int p,int u,int x)
{
if(p>cnt) return 1;
if(u==len) return dfs(p+1,0,1);
int lf=0;
FOR(i,x,n)
if((!vis[i])&&a[i]+u<=len&&a[i]!=lf)//剪枝2
{
vis[i]=1;
if(dfs(p,a[i]+u,i+1)) return 1;
vis[i]=0;lf=a[i];
if(u+a[i]==len||u==0) return 0;//剪枝3.4
}
return 0;
}
int main()
{
//freopen("hh.in","r",stdin);
nnn=rd();
FOR(i,1,nnn)
{
int tptp=rd();
if(tptp>50) continue;
a[++n]=tptp,cc+=a[n],gmax(mx,a[n]);
}
sort(a+1,a+n+1,greater<int>() );
//FOR(i,1,n) cout<<a[i]<<" ";cout<<endl;
for(len=mx;len<=cc;++len)
{
if(cc%len) continue;
cnt=cc/len;
memset(vis,0,sizeof(vis));
if(dfs(1,0,1)){cout<<len;break;}
}
return 0;
}

P1731 [NOI1999]生日蛋糕

https://www.luogu.org/problemnew/show/P1731

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define FOR(i,a,b) for(register int i(a);i<=b;++i)
#define For(i,a,b) for(register int i(a);i>=b;--i)
int mins[20],minv[20];
int ans=1<<30,s;
bool prune(int maxh,int maxr,int n,int v)
{
int cc=0;
FOR(i,0,n-1) cc+=(maxh-i)*(maxr-i)*(maxr-i);
if(cc<v) return 1;
else return 0;
}
void dfs(int maxh,int maxr,int n,int v,int m)
{
if(n==0)
{
if(v) return;
ans=min(ans,s);
}
if(s+mins[n]>ans) return;
if(maxh<n||maxr<n) return;
if(minv[n]>v) return;
if(prune(maxh,maxr,n,v)) return;
For(i,maxr,n)
{
if(n==m) s=i*i;
For(j,maxh,n)
{
s+=2*i*j;
dfs(j-1,i-1,n-1,v-i*i*j,m);
s-=2*i*j;
}
}
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
FOR(i,1,m)
mins[i]=mins[i-1]+2*i*i,
minv[i]=minv[i-1]+i*i*i;
if(n<minv[m]) printf("0");
else
{
int maxh=(n-minv[m-1])/(m*m)+1;
int maxr=sqrt((n-minv[m-1])/m)+1;
dfs(maxh,maxr,m,n,m);
if(ans==1<<30) printf("0");
else printf("%d",ans);
} return 0;
}

迭代加深

a.搜索树规模增长快

b.从小到大限制深度

双向搜索

“终态”明确,路径可逆

CH2401 送礼物

http://contest-hunter.org:83/contest/0x20%E3%80%8C%E6%90%9C%E7%B4%A2%E3%80%8D%E4%BE%8B%E9%A2%98/2401%20%E9%80%81%E7%A4%BC%E7%89%A9

先从前(N/2+2)中选若干个,存放,排序,去重

再枚举后一半,二分查找对应的前一半的值

 1 void dfs1(int i, unsigned int sum) {
2 if (i == half) {
3 a[++m] = sum;
4 return;
5 }
6 dfs1(i + 1, sum);
7 if (sum + g[i] <= w) dfs1(i + 1, sum + g[i]);
8 }
9
10 void calc(unsigned int val) {
11 int rest = w - val;
12 int l = 1, r = m;
13 while (l < r) {
14 int mid = (l + r + 1) / 2;
15 if (a[mid] <= rest) l = mid; else r = mid - 1;
16 }
17 ans = max(ans, a[l] + val);
18 }
19
20 void dfs2(int i, unsigned int sum) {
21 if (i == n + 1) {
22 calc(sum);
23 return;
24 }
25 dfs2(i + 1, sum);
26 if (sum + g[i] <= w) dfs2(i + 1, sum + g[i]);
27 }
28
29 int main() {
30 cin >> w >> n;
31 for (int i = 1; i <= n; i++) scanf("%d", &g[i]);
32 sort(g + 1, g + n + 1);
33 reverse(g + 1, g + n + 1);
34 half = n / 2 + 3;
35 dfs1(1, 0);
36 sort(a + 1, a + m + 1);
37 m = unique(a + 1, a + m + 1) - (a + 1);
38 dfs2(half, 0);
39 cout << ans << endl;
40 }

IDA*

估价函数+迭代加深

若当前深度+未来估价>深度限制,立即回溯

dfs剪枝与优化的更多相关文章

  1. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  2. [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)

    典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...

  3. hdu 5887 Herbs Gathering (dfs+剪枝 or 超大01背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5887 题解:这题一看像是背包但是显然背包容量太大了所以可以考虑用dfs+剪枝,贪心得到的不 ...

  4. 生日蛋糕 (poj1190) (dfs剪枝)

    [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为 ...

  5. [Codeforces 163D]Large Refrigerator (DFS+剪枝)

    [Codeforces 163D]Large Refrigerator (DFS+剪枝) 题面 已知一个长方体的体积为V,三边长a,b,c均为正整数,求长方体的最小表面积S V以质因数分解的形式给出 ...

  6. Sticks(UVA - 307)【DFS+剪枝】

    Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大 ...

  7. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  8. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  10. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

随机推荐

  1. 实验8.Vlan Hybrid实验

    # 实验8.Vlan Hybrid实验 本实验用于测试华为独有的混合式接口类型hybrid 实验组 配置交换机 对交换机sw1与sw2做具体配置 SW1 vlan ba 10 20 100 int g ...

  2. Android 编译系统 defconfig文件的确定

    Android 编译系统 defconfig文件的确定 背景 经常在驱动改动的时候,同时改动2个文件,才知道他们分别对应不同的编译结果. 路径 对应版本 kernel/msm-4.4/arch/arm ...

  3. STM32的内存管理(转)

    背景 这里针对STM32F407芯片+1M外部内存的内存管理!(全篇是个人愚见,如果错误,请不吝指出!) 定义 首先,定义3个内存池,分别是内部SRAM,外表SRAM和CCM:通过指定内存中的绝对地址 ...

  4. 79元国产ARM+DSP平台FFT实测分享

    T113-i国产ARM+DSP架构介绍 创龙科技SOM-TLT113是一款基于国产全志T113-i双核ARM Cortex-A7 +  HiFi4 DSP + 玄铁C906 RISC-V异构多核处理器 ...

  5. fisher线性判别分析和多分类问题探究

    本文继续来讨论另一种分类模型----fisher线性判别分析 目录 一.模型思想 二.SPSS的实现 1.参数设置 (1)定义范围 (2) 统计 (3)保存与分类 2.结果分析 (1)典则判别函数系数 ...

  6. Django详细笔记

    django 学习 特点 快速开发 安全性高 可伸缩性强 URL 组成部分 URL: 同意资源定位符 一个URL由以下几部分组成 scheme://host:port/path/?query-stri ...

  7. Python通过GPIO从DHT11温度传感器获取数据

    Python通过GPIO从DHT11温度传感器获取数据 设备:树莓派4B.DHT11.杜邦线 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器. 其精度湿度±5%RH, 温度±2℃,量程 ...

  8. Spring面试题及答案

    Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心: ①. IOC/DI(控制反转/依赖注入) :把dao依赖注入到s ...

  9. 全网最适合入门的面向对象编程教程:13 类和对象的Python实现-可视化阅读代码神器Sourcetrail的安装使用

    全网最适合入门的面向对象编程教程:13 类和对象的 Python 实现-可视化阅读代码神器 Sourcetrail 的安装使用 摘要: 本文主要介绍了可视化阅读代码神器Sourcetrail的安装与使 ...

  10. JavaScript系列:JS实现复制粘贴文字以及图片

    目录 一. 基于 Clipboard API 复制文字(推荐) 基本概念 主要方法 使用限制 实际应用示例 二.基于 document.execCommand('copy') 缺陷 实际应用示例 说明 ...