uva12558 (迭代加深搜索)
2016-07-29 13:24
218 查看
题目链接
题意:对一个分数(n/m)将它分解成若干个不相等的单分子分数(即分子为1)。求最少能分解成哪几个分数相加。若有多解,输出最大的分母尽量的小的解。会有k个禁止使用的单分子分数。
思路:这题搜索的特点就是深度和宽度都不确定,首先对于一个a/b,你不知道他的最优解有几个1/a类似形式的分数构成,这是宽度。对于每个1/i他的深度也是不确定的,唯一剪枝的条件就是确定深度后余下都选择1/i之和小于a/b。
详细过程见编码
题意:对一个分数(n/m)将它分解成若干个不相等的单分子分数(即分子为1)。求最少能分解成哪几个分数相加。若有多解,输出最大的分母尽量的小的解。会有k个禁止使用的单分子分数。
思路:这题搜索的特点就是深度和宽度都不确定,首先对于一个a/b,你不知道他的最优解有几个1/a类似形式的分数构成,这是宽度。对于每个1/i他的深度也是不确定的,唯一剪枝的条件就是确定深度后余下都选择1/i之和小于a/b。
详细过程见编码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=100000+10; set<ll>ban; int maxed; bool ok; ll v[maxn],ans[maxn]; ll gcd(ll a,ll b) {return b==0 ? a : gcd(b,a%b);}//求两个数最大公约数 ll get_first(ll a,ll b){return b/a+1;}//求比a/b小的最大的分子为一的分数 bool better(int d){//判断当前解比答案更满足题意 for(int i=d;i>=0;i--){ if(ans[i]!=v[i]){ return ans[i]==-1||v[i]<ans[i]; } } return false; } void dfs(int cur,ll from,ll a, ll b){//当前深度为cur,起点from开始搜和为a/b的解 if(cur==maxed){ if(b%a||ban.count(b/a)) return; v[cur]=b; if(better(cur)) memcpy(ans,v,sizeof(ll)*(cur+1)); ok=true; return; } from=max(from,get_first(a,b)); for(int i=from;;i++){ if(a*i>=b*(maxed-cur+1)) return;//如果剩下的解都是1/i还小于a/b那就说明不满足 if(ban.count(i)) continue; v[cur]=i; ll t1=a*i-b,t2=b*i;//约分求新的剩下 ll g=gcd(t1,t2); dfs(cur+1,i+1,t1/g,t2/g); } return; } int main() { int T,t=1;scanf("%d",&T); while(T--){ ban.clear(); ll a,b;int n; scanf("%lld %lld %d",&a,&b,&n); for(int i=0;i<n;i++){ ll x;scanf("%lld",&x);ban.insert(x); } ok=false; for(maxed=1;;maxed++){ memset(ans,-1,sizeof(ans)); dfs(0,get_first(a,b),a,b); if(ok) break; } printf("Case %d: %lld/%lld=",t++,a,b); printf("1/%lld",ans[0]); for(int i=1;i<=maxed;i++) printf("+1/%lld",ans[i]); puts(""); } }
相关文章推荐
- 迭代加深搜索IDA*---uva1343 the rotation game
- 从埃及分数看迭代加深搜索
- POJ 2248 迭代加深搜索
- bzoj2824 铁盘整理【迭代加深搜索】
- 埃及分数 迭代加深搜索 IDA*
- 迭代加深搜索:POJ3921
- 人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)
- codevs 2541 幂运算(迭代加深搜索)
- poj 2286 The Rotation Game 迭代加深搜索
- 迭代加深搜索初步
- 章七 埃及分数(迭代加深搜索)
- 迭代加深搜索(埃及分数)
- hdu 2616 Kill the monster(dfs+最优化剪枝+迭代加深搜索)
- Section 4.1 Fence Rails(DFS_ID迭代加深搜索+剪枝)
- 埃及分数 迭代加深搜索 IDA*
- vijos1159岳麓山上打水 (迭代加深搜索+dp)
- [jzoj]1262. 为奶牛熄灯(迭代加深搜索+一堆优化vs记忆化vs状压DP)
- UVA-11214 Guarding the Chessboard (迭代加深搜索)
- 埃及分数问题-迭代加深搜索与IDA*算法
- 1659: [Usaco2006 Mar]Lights Out 关灯 迭代加深搜索