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 ...
随机推荐
- BZOJ 3065 替罪羊树+动态开节点线段树
思路: RT 可以看VFK的题解 我写了半天拍了半天... 不过是$nlog^2n$的 要写垃圾回收的 线段树 如果某个节点的sum是0 也可以free掉 //By SiriusRen #inclu ...
- 3.Ventuz Designer新建项目Demo
Ventuz Designer新建项目Demo 1.打开ventuz,点Recent Projects>New Project,在弹出的界面填写具体项目信息,如下图: 图1.1 图1.2 2.在 ...
- BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3285 Solved: 1286[Submit][Status][Discuss] Descript ...
- 基于ACE的TAO开发---一个简单的入门实例-----VS2008(一)
万事开头难,不管做什么事最开始总是最困难的,一旦上手了就好了. 这也是我自己学习corba编程的一点经验和心得.下面的例子主要是保证读者跟着走能立马看到效果. 1.机器上的TAO是实现已经装好的开发版 ...
- TortoiseSvn问题研究(一)
问题描述 今天在工作中遇到一个SVN方面的问题,牵扯出使用SVN这一段时间的一系列问题. 具体来说,是这样的: 上周五有上线分支,自己的分支需要merge: 很多项目小组都在开发这个项目,再往前好像也 ...
- JavaScript数组操作函数
A: 购物车会有这样的情况,购物车是一个数组,每一个商品是一个对象,分别对应一个id,和一个num ,然后改变商品的时候需要和购物车对比,如果购物车中有这个商品的话,就只改变这个商品对应的id的num ...
- JS 1000以内的水仙花数 (三位数 各个数字的立方和等于本身 例如 1*1*1 + 5*5*5 + 7*7*7 = 157)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- bzoj 1192: [HNOI2006]鬼谷子的钱袋 思维_二进制
十分巧妙的一道题. 考虑当前凑出$[1,i/2)$,那么再有一个 $i/2$,就可以凑出 [i/2+1,i). 注意,这里的 $i$ 都是 2 的 $k$ 次幂. 于是,我们只要找到 $i$ 使得 2 ...
- Period UVA - 1328_结论题
Code: #include<cstdio> #include<cstring> using namespace std; const int maxn=1000000+5; ...
- jmeter实现逻辑控制器