0x22 迭代加深
poj2248 真是个新套路。还有套路剪枝...大到小和判重
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std; int n,D,x[];bool bk,v[][];
void dfs(int k)
{
if(bk==true)return ;
if(k==D+)return ;
if(x[k-]>n)return ;
if(x[k-]==n)
{
bk=true;
for(int i=;i<k-;i++)printf("%d ",x[i]);
printf("%d\n",x[k-]);
return ;
} memset(v[k],false,sizeof(v[k]));
for(int i=k-;i>=;i--)
{
if(x[i]+x[i]<x[k-])break;
for(int j=i;j>=;j--)
{
if(x[i]+x[j]<x[k-])break;
if(v[k][x[i]+x[j]]==false)
{
v[k][x[i]+x[j]]=true;
x[k]=x[i]+x[j];
dfs(k+);
x[k]=;
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==)break; D=;bk=false;x[]=;
while()
{
dfs();
if(bk==true)break;
D++;
}
}
return ;
}
poj2248
送礼物 折半搜索(orz cgh队长之前教我),书上叫双向搜索。又双叒叕有套路剪枝...大到小和很明显的可行性。结果dfs时居然还要先尝试选再尝试不选。。无语
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; int n;int W,c[];
bool cmp(int x,int y){return x>y;} int len;int a[];
inline void dfs(int k,int d)
{
if(k==n/+)
{
a[++len]=d;
return ;
}
if(((LL)d)+c[k]<=W)dfs(k+,d+c[k]);
dfs(k+,d);
}
int mmax;
int erfen(int k)
{
int l=,r=len;int ans;
while(l<=r)
{
int mid=(l+r)/;
if(a[mid]<=k)
{
ans=a[mid];
l=mid+;
}
else r=mid-;
}
return ans;
}
inline void dfs2(int k,int d)
{
if(k==n+)
{
mmax=max(mmax,d+erfen(W-d));return ;
} if(((LL)d)+c[k]<=W)dfs2(k+,d+c[k]);
dfs2(k+,d);
}
int main()
{
scanf("%d%d",&W,&n);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
sort(c+,c+n+,cmp); len=;dfs(,);
sort(a+,a+len+);len=unique(a+,a+len+)-a-;
mmax=a[len];
dfs2(n/+,);
printf("%d\n",mmax);
return ;
}#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; int n;int W,c[];
bool cmp(int x,int y){return x>y;} int len;int a[];
inline void dfs(int k,int d)
{
if(k==n/+)
{
a[++len]=d;
return ;
}
if(((LL)d)+c[k]<=W)dfs(k+,d+c[k]);
dfs(k+,d);
}
int mmax;
int erfen(int k)
{
int l=,r=len;int ans;
while(l<=r)
{
int mid=(l+r)/;
if(a[mid]<=k)
{
ans=a[mid];
l=mid+;
}
else r=mid-;
}
return ans;
}
inline void dfs2(int k,int d)
{
if(k==n+)
{
mmax=max(mmax,d+erfen(W-d));return ;
} if(((LL)d)+c[k]<=W)dfs2(k+,d+c[k]);
dfs2(k+,d);
}
int main()
{
scanf("%d%d",&W,&n);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
sort(c+,c+n+,cmp); len=;dfs(,);
sort(a+,a+len+);len=unique(a+,a+len+)-a-;
mmax=a[len];
dfs2(n/+,);
printf("%d\n",mmax);
return ;
}
送礼物
0x22 迭代加深的更多相关文章
- POJ1129Channel Allocation[迭代加深搜索 四色定理]
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14601 Accepted: 74 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- 迭代加深搜索 POJ 1129 Channel Allocation
POJ 1129 Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14191 Acc ...
- 迭代加深搜索 codevs 2541 幂运算
codevs 2541 幂运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- usaco4.12Fence Rails(迭代加深)
为了这题还去学了下迭代加深 回来还是不会写 只好参考各大神的代码及题解了 二分枚举最大可以切的块数 然后就是各种分析及优化 USACO题解里写了7个优化.. 问题分析 抽象一下就可以发现,算法的本质是 ...
- poj2286The Rotation Game(迭代加深dfs)
链接 把迭代加深理解错了 自己写了半天也没写对 所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索.这种方法虽然会导致重复的遍历 某些结点,但 ...
- IOI1994 北京2008的挂钟 迭代加深
总的来讲,这是一道很⑨的题,因为: (1)题目中有⑨个挂钟 (2)有⑨种操作方案 (3)这题因为解空间太小所以可以直接⑨重循环!! 这题可以用迭代加深搜索高效求解,剪枝的策略也很显然: >所求的 ...
- 迭代加深搜索算法总结 + Editing a Book UVa11212题解
迭代加深搜索算法: 对于可以用回溯法解决,但是解答树结点数大的恐怖的问题的一种解决办法,有的问题甚至用bfs连一层节点都遍历不完就超时了.具体方法就是依次枚举搜索层数,从1到一个上限. 结构: int ...
随机推荐
- 如何用SVG写一个环形进度条以及动画
本次案例主要使用了svg的三个元素,分别为circle.text.path,关于svg的介绍大家可以看MDN上的相关教程,传送门 由于svg可以写到HTML中,所以这里我们就可以很方便的做进度条加载动 ...
- href 与 src
href:常用有两个标签<a>和<link> 1.<a href="http://www.w3school.com.cn">W3School&l ...
- nodejs -- crypto MD5签名
MD5使用方法: const crypto = require('crypto'); var obj = crypto.createHash('md5'); // 可多次调用 update obj.u ...
- 30秒就能理解的JavaScript优秀代码
数组 arrayMax 返回数组中的最大值. 将Math.max()与扩展运算符 (...) 结合使用以获取数组中的最大值. const arrayMax = arr => Math.max(. ...
- WebService 服务接口
天气预报Web服务,数据来源于中国气象局Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmxDisco :http ...
- python安装Django需要环境
Django==1.10.3 -e git+https://github.com/duoshuo/duoshuo-python-sdk.git#egg=duoshuo-python-sdk djang ...
- redis BIO详解
BIO即background I/O service,后台I/O服务,是redis的aof持久化后台服务. redis把阻塞的同步I/O操作交给后台I/O服务来完成:close和fsync. clos ...
- Selenium3+python自动化008-常用操作
一.元素常用操作 1. clear() 清除文本 2. send_keys() 模拟输入 3. click() 单击元素 4.get_attr ...
- jQuery,您可以实现元素的淡入淡出效果。
fadeIn() fadeOut() fadeToggle() fadeTo() jQuery fadeIn() 用于淡入已隐藏的元素 $("button").click(func ...
- Disconf入门指南(1)
Disconf简介 参考: https://github.com/knightliao/disconf/wiki/TutorialSummary 在一个分布式环境中,同类型的服务往往会部署很多实例.这 ...