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 迭代加深的更多相关文章

  1. POJ1129Channel Allocation[迭代加深搜索 四色定理]

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14601   Accepted: 74 ...

  2. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  3. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

  4. 迭代加深搜索 codevs 2541 幂运算

    codevs 2541 幂运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...

  5. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

  6. usaco4.12Fence Rails(迭代加深)

    为了这题还去学了下迭代加深 回来还是不会写 只好参考各大神的代码及题解了 二分枚举最大可以切的块数 然后就是各种分析及优化 USACO题解里写了7个优化.. 问题分析 抽象一下就可以发现,算法的本质是 ...

  7. poj2286The Rotation Game(迭代加深dfs)

    链接 把迭代加深理解错了 自己写了半天也没写对 所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索.这种方法虽然会导致重复的遍历 某些结点,但 ...

  8. IOI1994 北京2008的挂钟 迭代加深

    总的来讲,这是一道很⑨的题,因为: (1)题目中有⑨个挂钟 (2)有⑨种操作方案 (3)这题因为解空间太小所以可以直接⑨重循环!! 这题可以用迭代加深搜索高效求解,剪枝的策略也很显然: >所求的 ...

  9. 迭代加深搜索算法总结 + Editing a Book UVa11212题解

    迭代加深搜索算法: 对于可以用回溯法解决,但是解答树结点数大的恐怖的问题的一种解决办法,有的问题甚至用bfs连一层节点都遍历不完就超时了.具体方法就是依次枚举搜索层数,从1到一个上限. 结构: int ...

随机推荐

  1. B - Mike and Cellphone(map)

    Problem description While swimming at the beach, Mike has accidentally dropped his cellphone into th ...

  2. (转)一个vue路由参数传递的注意点

    首先我的路由的定义 { path: '/b', name: 'B', component: resolve => require(['../pages/B.vue'], resolve) } 我 ...

  3. 转载:SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的SQL语句 SQL Server 表变量的用法 究竟什么是敏捷测试--朱少民

  4. OpenCV中GPU模块使用

    CUDA IT168的文章系列: Cuda的初始化:http://tech.it168.com/a2011/0715/1218/000001218458.shtml OpenCV: OpenCV中GP ...

  5. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

  6. JS操作DOM的一些常用方法

    getElementById():获取有指定惟一ID属性值文档中的元素 getElementsByName(name):返回的是数组 getElementsByTagName():返回具有指定标签名的 ...

  7. CSS3实现1前端常用Loading效果

    此页动画效果都是gif图的,不想用代码写的话,下载图片就可使用. 第1种效果: 代码如下 <div class="loading"> <span></ ...

  8. c++ 优先级队列(priority_queue)

    从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在 ...

  9. win10更新后程序路径盘符变成*星号解决方法

    发现这个问题是当我在命令行里输入java -version时提示 找不到*:\Program Files\Java...之类的 怎么好好的D:\Program Files\Java变成了*:\Prog ...

  10. 【Git教程】Git教程及使用命令

      Git是目前世界上最先进的分布式版本控制系统,可以自动记录和管理文件的改动,还可以团队写作编辑,也就是帮助我们对不同的版本进行控制.2008年,GitHub网站上线,为开源项目提供免费存储,迅速发 ...