社区
数据结构与算法
帖子详情
求埃及分数的最佳分法
rickone
2005-06-07 08:40:34
加精
埃及分数即单位分数:1/a,a>1
任意给定一个分数:a/b,0<a<b 都能表示成有限个埃及分数之和。
输入a b
输出最好的一种分法。
最好这样定义:首先分数个数越少越好,如果个数一样,则最大分母越小越好。如:
19/45=1/3+1/12+1/180
...
19/45=1/5+1/6+1/18
最后一种最大分母是18,他是其他分法中各个最大分母中最小的,所以最后一种分法是最好的。
...全文
455
17
打赏
收藏
求埃及分数的最佳分法
埃及分数即单位分数:1/a,a>1 任意给定一个分数:a/b,0<a<b 都能表示成有限个埃及分数之和。 输入a b 输出最好的一种分法。 最好这样定义:首先分数个数越少越好,如果个数一样,则最大分母越小越好。如: 19/45=1/3+1/12+1/180 ... 19/45=1/5+1/6+1/18 最后一种最大分母是18,他是其他分法中各个最大分母中最小的,所以最后一种分法是最好的。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cygandti
2005-06-10
打赏
举报
回复
呵呵,看看程序哦!
rickone
2005-06-10
打赏
举报
回复
if(tempb[x-1]/tempa[x-1]+num-x+1>best[num])return;
是这一句?强剪枝?
NowCan
2005-06-09
打赏
举报
回复
呵呵,很可能是“g c d"连在一起了。
rickone
2005-06-09
打赏
举报
回复
哦,我似乎明白了一些~~~
rickone
2005-06-09
打赏
举报
回复
prev=(int(tempb[x-1]/tempa[x-1])>int(v[x-1]+1))?int(tempb[x-1]/tempa[x-1]):int(v[x-1]+1);
next=int((num-x+1)*tempb[x-1]/tempa[x-1]+zero);
if(tempb[x-1]/tempa[x-1]+num-x+1>best[num])return;
for(i=prev;i<=next;i++)
{
v[x]=i;
tempa[x]=tempa[x-1]*i-tempb[x-1];
if(tempa[x]<0)continue;
tempb[x]=tempb[x-1]*i;
if(tempa[x]>-zero && int(tempa[x]*v[x]/tempb[x])<=num-x)
solve(x+1);
}
从这里看是定界分支吗?我以前编的怎么会明显延时,奇怪了,哪里有很强的剪枝?
rickone
2005-06-09
打赏
举报
回复
能多添点注释或说明吗?为什么要用double类型呢,还望指教!
mmmcd
2005-06-09
打赏
举报
回复
这个是迭代加深的
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
const double zero=1e-20;
const double maxn=1e20;
int num;
bool bb;
double tempa[1000],tempb[1000],best[1000],v[1000];
int g_cd(int a,int b)
{
int ta,tb;
ta=a;tb=b;
if(ta<tb)swap(ta,tb);
if(!(ta%tb))return tb;
else return g_cd(tb,ta%tb);
}
void solve(int x)
{
int i,next,temp,prev;
if(x>num)
{
if(fabs(tempa[num])<zero)
{
bb=1;
if(v[num]<best[num])
for(i=1;i<=num;i++)
best[i]=v[i];
}
}else
{
prev=(int(tempb[x-1]/tempa[x-1])>int(v[x-1]+1))?int(tempb[x-1]/tempa[x-1]):int(v[x-1]+1);
next=int((num-x+1)*tempb[x-1]/tempa[x-1]+zero);
if(tempb[x-1]/tempa[x-1]+num-x+1>best[num])return;
for(i=prev;i<=next;i++)
{
v[x]=i;
tempa[x]=tempa[x-1]*i-tempb[x-1];
if(tempa[x]<0)continue;
tempb[x]=tempb[x-1]*i;
if(tempa[x]>-zero && int(tempa[x]*v[x]/tempb[x])<=num-x)
solve(x+1);
}
}
}
int main(int argc, char *argv[])
{
int i,j,n,temp,a,b;
cin>>n;
for(j=0;j<n;j++)
{
cin>>a>>b;
temp=g_cd(a,b);
a/=temp;b/=temp;
if(a==1)
cout<<b<<endl;
else
{
v[0]=b/a;num=1;
bb=0;best[1]=maxn;
while(1)
{
num++;
best[num]=maxn;
tempa[0]=a;tempb[0]=b;
solve(1);
if(bb)break;
}
for(i=1;i<num;i++)
cout<<setiosflags(ios::fixed)<<setprecision(0)<<best[i]<<' ';
cout<<best[num]<<endl;
}
}
//system("PAUSE");
return 0;
}
cygandti
2005-06-09
打赏
举报
回复
这个程序好象要加一个判断条件哦!判断是不是最佳,条件上面有了啊!首先分数个数越少越好,如果个数一样,则最大分母越小越好。
按照上面的程序,它要做的事情还有下面几点:
1、要把分数个数最少的几个找出来。
2、再在这几个中找出最佳的最大分母越小的。
我怎么感觉有更好的想法啊???
cygandti
2005-06-09
打赏
举报
回复
但上面的程序好象达不到他的最佳要求啊???
cygandti
2005-06-09
打赏
举报
回复
递归啊!好象没有什么啊???
zzwu
2005-06-09
打赏
举报
回复
啊,真的和 g c d 有关, 我改一下
埃级分数问题:
在古埃及,由于人们缺乏对分数的认识,只使用分子为1的分数,对分子不为1的分数用几个分子为1,分母不同的分数之和来表示。例如2/3=1/2+1/6。这种分子为1的分数称之为古埃及分数。请编程对任意的分数用古埃及分数表示出来。(青赛题)
分析:为了精确起见,本题不应该有实数型参于运算,全部采用整型数据进行运算,这样会用到分数的运算:通分、约分、求最大公约数,最小公倍数等相关问题,是一道综合性比较强的题型。如果本题给出输入,输出样例,如:
input(输入)
2/3
output(输出)
2/3=1/2+1/6
那么我们还得用到字符串的有关知识将分子分母取出来,关转换成整型数值。
program lx(input,output);
var a,b,s,x,y,i:integer;
c:string;
function g_cd(x,y:integer):integer;
var rem:integer;
begin
repeat
rem:=x mod y;
x:=y;
y:=rem
until rem=0;
g_cd:=x
end;
function lcm(x,y:integer):integer;
var m:integer;
begin
lcm:=x*y div g_cd(x,y)
end;
begin
writeln('INPUT a / b:');
readln(a);
readln(b);
write(a,'/',b,'=');
s:=2;
while a<>1 do
begin
x:=lcm(b,s);
if (a*(x div b))>(x div s) then
begin
write('1/',s,'+');
a:=a*(x div b)-x div s;
b:=x;
i:=g_cd(a,b);
a:=a div i;
b:=b div i
end;
s:=s+1
end;
writeln(a,'/',b)
end.
zzwu
2005-06-09
打赏
举报
回复
"请不要发表可能给我们带来伤害的言论,谢谢配合"
我上次在转贴时也碰到过一次,有点莫名其妙,是一个查不出与政治有关的纯数学贴。
rickone
2005-06-09
打赏
举报
回复
什么算法?还望提示一下,或者给个链接,谢谢!
GetTheWorld
2005-06-08
打赏
举报
回复
"请不要发表可能给我们带来伤害的言论,谢谢配合"
?????
mmmcd
2005-06-08
打赏
举报
回复
代码贴不出来
请不要发表可能给我们带来伤害的言论,谢谢配合
mmmcd
2005-06-08
打赏
举报
回复
我收藏有一个
Zephyrzzz
2005-06-08
打赏
举报
回复
好象有一个IDA*算法,即迭代加深的A*算法,上网找找吧.
埃及
分数
问题的
最佳
分法
埃及
分数
即单位
分数
:1/a,a>1 任意给定一个
分数
:a/b,0
埃及
分数
之和。 输入a b 输出最好的一种
分法
。 最好这样定义:首先
分数
个数越少越好,如果个数一样,则最大分母越小越好。如: 19/45=1/3+1/12+1/180 ... 19/45=1/5+1/6+1/18 最后一种最大分母是18,他是其他
分法
中各个最大分母中最小的,所以最后一种
分法
是最好的。
ACM程序设计培训教程
被毁坏的玉米地 ACM程序设计培训教程 经典数据结构与算法……………………………………………………………1 1.1 线性表………………………………………………………………………………1 1.1.1 线性表的顺序存储结构……………………………………………………1 1.1.2 插入操作……………………………………………………………………2 1.1.3 删除操作……………………………………………………………………2 1.1.4 线性表的链式存储…………………………………………………………2 1.1.5 单链表………………………………………………………………………2 1.1.6 单链表的插入操作…………………………………………………………3 1.1.7 单链表的删除操作…………………………………………………………3 1.1.8 循环链表……………………………………………………………………4 1.1.9 双向链表……………………………………………………………………5 1.1.10 双向链表的插入操作………………………………………………………5 1.1.11 双向链表的删除操作………………………………………………………5 1.1.12 静态链表……………………………………………………………………5 1.2 栈………………………………………………………………………………………………5 1.2.1 顺序栈……………………………………一…………………………………6 1.2.2 链栈……………………………………………………………………………………………………9 l.3 队列…………………………………………………………………………………………10 1.3.1 链队列………………………………………………………………………10 1.3.2 循环队列……………………………………………………………………12 1.4 串的定义……………………………………………………………………………13 1.5 抽象数据类型串的实现……………………………………………………………14 1.5.1 定长顺序串…………………………………………………………………14 1.5.2 堆串………………………………………………………………………………18 1.5.3 块链串………………………………………………………………………24 1.6 查找的基本概念……………………………………………………………………24 1.6.1 顺序查找法…………………………………………………………………25 1.6.2 折半查找法…………………………………………………………………26 1.6.3 分块查找法…………………………………………………………………27 1.6.4 基于树的查找法……………………………………………………………28 1.6.5 计算式查找法——哈希法…………………………………………………28 1.7 排序的基本概念……………………………………………………………………33 1.7.1 插入类排序…………………………………………………………………34 1.7.2 直接插入排序………………………………………………………………34 1.7.3 折半插入排序………………………………………………………………35 1.7.4 表插入排序…………………………………………………………………36 1.7.5 冒泡排序……………………………………………………………………39 1.7.6 快速排序……………………………………………………………………40 1.8 分配类排序…………………………………………………………………………41 1.8.1 多关键字排序………………………………………………………………42 1.8.2 链式基数排序………………………………………………………………42 1.8.3 基数排序的顺序表结构……………………………………………………45 1.8.4 各种排序方法的综合比较…………………………………………………46 第2章 蛮力法………………………………………………………………………47 2.1搜索所有的解空间…………………………………………………………………47 〖案例l〗假金币…………………………………………………………………47 〖案例2〗现在的时间是多少……………………………………………………49 2.2 搜索所有的路径……………………………………………………………………52 〖案例3〗矩阵……………………………………………………………………52 2.3 直接计算……………………………………………………………………………54 〖案例4〗数的长度………………………………………………………………54 2.4 模拟与仿真…………………………………………………………………………56 〖案例5〗冲撞的机器人…………………………………………………………56 第3章 贪心算法………………………………………………………………………61 3.1 构造法………………………………………………………………………………61 〖案例1〗订票……………………………………………………………………6I 3.2 反证法………………………………………………………………………………67 〖案例2〗电梯……………………………………………………………………68 3.3 调整法………………………………………………………………………………70 〖案例3〗水位……………………………………………………………………70 〖案例4〗
埃及
分数
………………………………………………………………73 〖案例5〗数划分的研究…………………………………………………………74 第4章 背包问题………………………………………………………………………78 4.1 用贪心法解决背包问题……………………………………………………………78 〖案例1〗
最佳
装载………………………………………………………………78 4.2 回溯法解决背包问题………………………………………………………………81 〖案例2〗0/1背包…………………………………………………………………81 4.3 遗传算法解决背包问题……………………………………………………………86 〖案例3〗0/1背包……………………………………………………………86 4.4 动态规划解决背包问题……………………………………………………………94 〖案例4〗适配背包………………………………………………………………94 第5章回溯法………………………………………………………………………97 5.1 组合与数的问题……………………………………………………………………97 〖案例l〗组合问题………………………………………………………………97 〖案例2〗数的划分………………………………………………………………99 5.2 回溯法与搜索……………………………………………………………………101 〖案例3〗素数填表问题…………………………………………………………101 〖案例4〗八皇后问题……………………………………………………………105 第6章 动态规划……………………………………………………………………109 6.1 最优子结构………………………………………………………………………1 1 1 〖案例1〗拦截导弹………………………………………………………………1ll 6.2 应用动态规划的步骤……………………………………………………………113 〖案例2〗公共子序列……………………………………………………………113 〖案例3〗Uxuhul的表决…………………………………………………………115 第7章 DFS与BFS以及剪枝问题……………………………………………………119 7.1 深度优先遍历……………………………………………………………………119 〖案例l〗15数码难题……………………………………………………………120 〖案例2〗三角形大战……………………………………………………………121 7.2 宽度优先遍历……………………………………………………………………122 〖案例3〗蛇和梯子………………………………………………………………123 7.3 剪枝方法…………………………………………………………………………127 第8章 线性规划和整数规划…………………………………………………………129 8.1 简单线性规划……………………………………………………………………129 〖案例l〗炼金术…………………………………………………………………129 8.2 整数规划…………………………………………………………………………134 〖案例2〗装箱问题………………………………………………………………134 第9章 最小生成树…………………………………………………………………139 9.1 Prim算法…………………………………………………………………………………………………140 9.2 Kruskal算法………………………………………………………………………………………………143 9.3 Sollin算法…………………………………………………………………………………………………145 第10章 大数问题……………………………………………………………………146 10.1 大数的加减………………………………………………………………………146 〖案例1〗整数探究………………………………………………………………146 10.2 大数的乘积……………………………………………………………………148 〖案例2〗相连游戏………………………………………………………………148 〖案例3〗公牛的数学……………………………………………………………150 10.3 用FFT作大数乘法………………………………………………………………151 〖案例4〗X问题…………………………………………………………………152 10.4 任意精度计算……………………………………………………………………155 〖案例5〗幂……………………………………………………………………155 10.5 大数的除法………………………………………………………………………157 第11章 计算几何学…………………………………………………………………158 11.1 判断点是否在多边形中…………………………………………………………158 11.2 判断线段是否在多边形内………………………………………………………159 11.3 计算几何典型算法………………………………………………………………160 〖案例1〗计算周长问题…………………………………………………………161 〖案例2〗正方形问题……………………………………………………………162 〖案例3〗计算平面点集凸壳的算法……………………………………………163 第12章 着色问题与排队论……………………………………………………………167 12.1 着色问题…………………………………………………………………………168 12.1.1 顶点着色问题……………………………………………………………168 12.1.2 边着色问题………………………………………………………………177 12.2 排队论……………………………………………………………………………………………………179 第13章 组合数学……………………………………………………………………188 13.1 鸽巢原理…………………………………………………………………………188 13.2 容斥原理…………………………………………………………………………190 〖案例1〗棋盘覆盖问题…………………………………………………………192 〖案例2〗被毁坏的玉米地(Crop Circles)问题………………………………193 13.3 递推关系…………………………………………………………………………197 〖案例3〗Josephus问题…………………………………………………………197 〖案例4〗假币问题………………………………………………………………199 13.4 发生函数…………………………………………………………………………202 13.5 Polya定理………………………………………………………………………………………………204 第14章 概率论…………………………………………………………………………206 14.1 基本概念…………………………………………………………………………206 14.2 基本概率算法……………………………………………………………………208 〖案例1〗快速排序………………………………………………………………209 〖案例2〗八皇后问题……………………………………………………………210 14.3 蒙特卡罗(Monte Carlo)型概率算法…………………………………………214 第15章 凸包问题……………………………………………………………………217 15.1 穷举法解决凸包问题……………………………………………………………217 15.2 格雷厄姆扫描法解决凸包问题…………………………………………………218 15.3 分治法解决凸包问题……………………………………………………………220 15.4 蛮力法解决凸包问题……………………………………………………………222 15.5 Jarris步进法解决凸包问题………………………………………………………224 15.6 应用…………………………………………………………………………………………………………227 〖案例l〗果园篱笆………………………………………………………………227 〖案例2〗巨人和鬼………………………………………………………………232 第16章 数论问题……………………………………………………………………236 16.1 数的幂运算………………………………………………………………………236 〖案例l〗高级模运算……………………………………………………………236 16.2 欧拉定理的应用…………………………………………………………………238 〖案例2〗快乐2004……………………………………………………………239 〖案例3〗2x mod n=1……………………………………………………………240 16.3 素数测试…………………………………………………………………………243 〖案例4〗素数距离………………………………………………………………243 〖案例5〗素数测试………………………………………………………………246 16.4 Pell方程…………………………………………………………………………………………………250 〖案例6〗Smith问题……………………………………………………………250 附录A 排课时间表问题源代码………………………………………………………258 参考文献………………………………………………………………………………269
c++解决
埃及
分数
问题(迭代加深搜索)
在古
埃及
,人们使用单位
分数
的和(形如1/a的,a是自然数)表示一切有理数。例如2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为家属中间有相同的。首先加数少的比加数多的好,其次,加数个数相同的,最小
分数
越大越好。for循环判断条件fm*(maxl-l+1)>i*fz,假设后面的
分数
都是1/i,如果在指定的层数之前,1/i×剩余的层数都无法大于指定的
分数
,则减枝,以为后边的
分数
都要比此时1/i要小。最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180大。
贪心算法——>解决
埃及
分数
、数列极差问题
一、算法的描述 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地
求
得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。 二、算法的设计思想 首先贪婪算法的原理是通过局部最优来达到全局最优,采用的是逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的(在一定的标准下),决策一旦作出,就不可再更改。用贪婪算法只能解决通过局部最优的策略能达到全局最优的问...
埃及
分数
问题 - 迭代加深搜索经典问题
在古
埃及
,人们使用单位
分数
的和(即1/a, a是自然数)表示一切有理数。例如2/3 = 1/2 + 1/6,但不允许2/3 = 1/3 + 1/3,因为在加数中不允许有相同的。 对于一个
分数
a/b,表示方法有很多种,其中加数少的比加数多的好,如果加数个数相同,则最小的
分数
越大越好。例如,19/45 = 1/5 + 1/6 + 1/18是最优方案。 输入整数a,b(0 < a < b < 500),试编程计算
最佳
表达式。 理论上可以用回溯法
求
解,但是如果用宽度优先遍历,连一层都拓展不完(因为每一层都是无限大
数据结构与算法
33,010
社区成员
35,327
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章