IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索)

启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~)

这题。。。

理论上可以回溯,但是解答树非常恐怖,深度没有明显上界,加数的选择理论上也是无限的。

我们可以从小到大枚举深度maxd,

设计估价函数,当扩展到第i层,前i个分数的和为c/d,第i的分数为1/e,接下来至少需要(a/b+c/d)/(1/e)个分数,如果超过maxd-i+1,那么直接回溯就好了。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define LL long long
#define Maxn 1100 LL a,b;
LL maxd,ans[Maxn],v[Maxn]; bool qq[]; LL mymax(LL x,LL y) {return x>y?x:y;} bool better(LL d)
{
for(LL i=d;i>=;i--) if(v[i]!=ans[i])
{
return ans[i]==-||v[i]<ans[i];
}
return ;
} LL get_first(LL a,LL b)
{
for(LL i=;;i++)
{
if(b<=a*i) return i;
}
} LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
} bool dfs(LL d,LL from,LL aa,LL bb)
{
if(d==maxd)
{
if(bb%aa) return ;
v[d]=bb/aa;
if(v[d]<=&&!qq[v[d]]) return ;
if(better(d)) memcpy(ans,v,sizeof(ans));
return ;
}
bool ok=;
from=mymax(from,get_first(aa,bb));
for(LL i=from;;i++)
{
if(i<=&&!qq[i]) continue;
if(bb*(maxd+-d)<=i*aa) break;
v[d]=i;
LL b2=bb*i;
LL a2=aa*i-bb;
LL g=gcd(a2,b2);
if(dfs(d+,i+,a2/g,b2/g)) ok=;
}
return ok;
} int main()
{
LL T,kase=;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&a,&b);
memset(qq,,sizeof(qq));
LL k;
scanf("%lld",&k);
for(LL i=;i<=k;i++)
{
LL x;
scanf("%lld",&x);
qq[x]=;
}
for(maxd=;;maxd++)
{
memset(ans,-,sizeof(ans));
if(dfs(,get_first(a,b),a,b)) break;
}
printf("Case %lld: %lld/%lld=",++kase,a,b);
printf("1/%lld",ans[]);
for(LL i=;i<=maxd;i++) printf("+1/%lld",ans[i]);
printf("\n");
/*printf("%d\n",maxd);
for(LL i=1;i<=maxd;i++) printf("%d\n",ans[i]);*/
}
return ;
}

话说题目上的hard case我的程序也跑不出来。。。ORZ。。

2016-11-14 20:17:33

【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)的更多相关文章

  1. UVa 12558 - Egyptian Fractions (HARD version)

    题目大意: 给出一个真分数,把它分解成最少的埃及分数的和.同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大. 分析: 迭代加深搜索,求埃及分数的基础上,加上禁用限制就可以了.具体可以 ...

  2. UVA12558-Efyptian Fractions(HARD version)(迭代加深搜索)

    Problem UVA12558-Efyptian Fractions(HARD version) Accept:187  Submit:3183 Time Limit: 3000 mSec  Pro ...

  3. UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)

    UVA12558 Egyptian Fractions (HARD version) 题解 迭代加深搜索,适用于无上界的搜索.每次在一个限定范围中搜索,如果无解再进一步扩大查找范围. 本题中没有分数个 ...

  4. uva12558 Egyptian Fractions (HARD version)(迭代深搜)

    Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...

  5. 埃及分数 迭代加深搜索 IDA*

    迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...

  6. UVA12558 Egyptian Fractions (HARD version)(埃及分数)

    传送门 题目大意 给出一个真分数 a/b,要求出几个互不相同的埃及分数(从大到小),使得它们之和为 a/b (埃及分数意思是分子为1的分数,详见百度百科) 如果有多组解,则分数数量少的优先 如果分数数 ...

  7. UVA - 11214 Guarding the Chessboard(迭代加深搜索)

    题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...

  8. uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索

    迭代加深搜索 自己看的时候第一遍更本就看不懂..是非常水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题而且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的 ...

  9. 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...

随机推荐

  1. Linux - 重定向与管道

    标准输出重定向 ">" 操作符:覆盖目标文件内容 huey@huey-K42JE:~/huey/linux/cmdline$ date > foo huey@huey- ...

  2. Fragment的数据传递

    开发之中用到的Fragment的次数越来越多,很多小的项目都已经直接在使用Fragment作为Activity的载体来切换页面.而在开发之中页面的切换我们最关心的问题就是数据的传递了.今天我们主要来研 ...

  3. ionic+cordova+angularJs监听刷新

    普通的js返回并刷新这里就不多说了,百度就有很多方法. 下面说的是使用了angularjs.ionic开发的一个手机app中我使用的返回上一页并刷新的方法. 场景:回复的页面是单独的,点击保存回复后会 ...

  4. 对比MySQL,什么场景MongoDB更适用

    原文链接: http://page.factj.com/blog/p/4078 MongoDB已经流行了很长一段时间,相对于MySQL,究竟什么场景更需要用MongoDB?下面是一些总结. 更高的写入 ...

  5. CSS高度塌陷

    问题描述:当父元素只包含浮动的元素的时候,且父元素没有设置高度,如果父元素设置了边框border,那么看起来子元素不在父元素之内. 比如这样: html: <div id="paren ...

  6. mysql学习笔记5

    phpmyadmin中向数据表中插入新数据 INSERT INTO tb_admin(`table_id`, `table_name`, `table_des`, `table_time`)  VAL ...

  7. OpenJudge 2774 木材加工

    1.链接: http://bailian.openjudge.cn/practice/2774/ 2.题目: 总Time Limit: 1000ms Memory Limit: 65536kB Des ...

  8. GCC编译器入门

    GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...

  9. unix 常用命令

    (一)基本命令 命令格式: 命令 参数 1.ls 显示文件名,等同于dos下dir命令 命令格式:ls [option] file option: -l 显示详细列表 域1 :文件类型和文件权限 域2 ...

  10. Oracle配置

    1.安装Oracle11g--->通过Database Configuration Assistant创建新数据库 建数据库注意记住数据库名和SID,安装最后一步解锁scott[密码填tiger ...