UVA12558 Egyptian Fractions (HARD version)

题解

迭代加深搜索,适用于无上界的搜索。每次在一个限定范围中搜索,如果无解再进一步扩大查找范围。

本题中没有分数个数和分母的上限,只用爆搜绝对TLE。故只能用迭代加深搜索。

#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
int num,T,t,k;
ll h[],ans[],a,b,q;
set <ll> del; //存储不能用的数
bool ok;
inline ll gcd(ll A,ll B) {return B ? gcd(B,A%B):A;}
inline bool better(){ //判断最优解
for(int i=num;i>=;--i)
if(h[i]!=ans[i])
return ans[i]==-||h[i]<ans[i];
return ;
}
inline void dfs(ll p1,ll p2,int last,int cnt){//p1/p2:分子/分母 last:这次从哪个分母开始搜 cnt:已经添加了几个子分数
if(cnt==num){
if(p2%p1||del.count(p2/p1)) return ; //分子不为1或者这个数被禁止出现
h[cnt]=p2; ok=;
if(better()) memcpy(ans,h,sizeof(ll)*(cnt+)); //更新最优解
return ;
}
for(ll i= last>p2/p1+ ? last:p2/p1+;;++i) // p2/p1+1:符合条件的最小分母,用于剪枝
{
if(p1*i>=p2*(num-cnt+)) break; //发现最后减不完了,跳出
if(del.count(i)) continue;
ll q1=p1*i-p2,q2=p2*i,G=gcd(q1,q2); //通分
h[cnt]=i;
dfs(q1/G,q2/G,i+,cnt+);
}
}
int main(){
scanf("%d",&T);
for(t=;t<=T;++t){
del.clear(); ok=;
scanf("%lld%lld%d",&a,&b,&k);
for(int i=;i<=k;++i) scanf("%lld",&q),del.insert(q);
for(num=;!ok;++num){ //限定范围
memset(ans,-,sizeof(ans));
dfs(a,b,b/a+,); //b/a+1同上p2/p1+1
}--num; //注意要减掉多出的一次++num操作
printf("Case %d: %lld/%lld=",t,a,b);
for(int i=;i<num;++i) printf("1/%lld+",ans[i]);
printf("1/%lld\n",ans[num]);
}
return ;
}

UVA12558 Egyptian Fractions (HARD version) (埃及分数,迭代加深搜索)的更多相关文章

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

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

  2. codevs 1288 埃及分数 (迭代加深搜索)

    题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ...

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

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

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

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

  5. UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)

    题目大意:经典的埃及分数问题. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # i ...

  6. Vijos 1308 埃及分数 - 迭代加深

    描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b,表示方法有很多种, ...

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

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

  8. UVa 12558 - Egyptian Fractions (HARD version)

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

  9. 埃及分数问题_迭代加深搜索_C++

    一.题目背景 http://codevs.cn/problem/1288/ 给出一个真分数,求用最少的1/a形式的分数表示出这个真分数,在数量相同的情况下保证最小的分数最大,且每个分数不同. 如 19 ...

随机推荐

  1. div的最小宽高和最大宽高

    div的最小宽高和最大宽高很少使用但是很实用,今天敲代码,就遇到了,要在div里设置滚动条,众所周知,一般是设overflow-y:auto,但需要一个高度,只有div里的内容超过这个高度时,才会有滚 ...

  2. POJ-2181 Jumping Cows(贪心)

    Jumping Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7329 Accepted: 4404 Descript ...

  3. MapReduce规约

    深入了解Combiners编程(相当于Map端的Reduce) 每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量. comb ...

  4. 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考???

    https://blog.csdn.net/saw009/article/details/80590245 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考??? 首先图1是LeNe ...

  5. oracle(四) 常用语句

    1.分页 select t2.* from (select rownum row, t1.*  from your_table where rownum < ?) t2 where t2.row ...

  6. 万恶之源 - Python函数进阶

    函数参数-动态参数 之前我们说过传参,如果我们在传参数的时候不很清楚有哪些的时候,或者说给一个函数传了很多参数,我们就要写很多,很麻烦怎么办呢,我们可以考虑使用动态参数 形参的第三种:动态参数 动态参 ...

  7. How many Fibs?(poj 2413)大数斐波那契

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/C Description Recall the defi ...

  8. Java 7代码层面上的更新

    Java 7已经完成的7大新功能:       1 对集合类的语言支持:       2 自动资源管理:       3 改进的通用实例创建类型推断:       4 数字字面量下划线支持:      ...

  9. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal _ Medium tag: BFS

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  10. java selenium webdriver处理JS操作窗口滚动条

    未经作者允许,禁止转载!!! java selenium webdriver处理JS操作窗口滚动条 java selenium webdriver处理JS操作窗口滚动条 import org.open ...