五家共井 穷举法_经典算法题——五家共井
古代数学巨著《九章算数》中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;
丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。
意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子
一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打
到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。
最后问:井有多深?每家的绳子各有多长?
分析:同样这套题也是属于不定方程,拿这个题目的目地就是让大家能够在不定方程组这种范畴问题上做到“举一反三”,根据题意
我们设井深为h,各家分别为a,b,c,d,e,则可以列出如下方程组:
2a+b=h ①
3b+c=h ②
4c+d=h ③
5d+e=h ④
6e+a=h ⑤
首先我们看下普通青年的想法,他们的想法是找a,b,c,d,e之间的对应关系。
依次将②代入①,③代入②,④代入③,⑤代入④可得如下方程组:
a=b+c/2
b=c+d/3
c=d+e/4
d=e+a/5
从计算机的角度来说,我不希望有小数的出现,所以我可推断: c一定是2的倍数,d一定是3的倍数,e一定是4的倍数,a一定是5的倍数,根据这种关系我们
就可以有如下代码:
namespaceTest
{classProgram
{static void Main(string[] args)
{inta, b, c, d, e, h;
a= b = c = d = e = h = 0;bool flag = true;while(flag)
{//4的倍数
e += 4;
a= 0;while(flag)
{//5的倍数
a += 5;
d= e + a / 5;
c= d + e / 4;if (c % 2 != 0)continue;if (d % 3 != 0)continue;
b= c + d / 3;if (b + c / 2
flag= false;
}
}
h= 2 * a +b;
Console.WriteLine("a={0},b={1},c={2},d={3},e={4} ------h={5}\n", a, b, c, d, e, h);
Console.Read();
}
}
}
同样我们的时间复杂度是O(N2),急需优化。
我们再来看看文艺青年的想法,他们的想法是找a,b,c,d,e中的某个数与h的对应关系。
比如我就找c与h的对应关系,上面的①②③④⑤可写成如下方程组:
b=h-2a ⑥
c=h-3b ⑦
d=h-4c ⑧
e=h-5d ⑨
a=h-6e ⑩
将⑥,⑧,⑨,⑩分别代入⑦,一阵痉挛后可知:
c=(148/721)h
上面的公式也就表明了c和h的比例关系,我们令 h=721k,则 c=148k,将其代入⑥,⑦,⑧,⑨,⑩可得如下方程组
a=265k
b=191k
c=148k
d=129k
e=76k
x=721k
又因为k>0,所以题目有无数个解。这里我就取0
namespaceTest
{classProgram
{static void Main(string[] args)
{for (int k = 1; k < 5; k++)
{int h = 721 *k;int a = 265 *k;int b = 191 *k;int c = 148 *k;int d = 129 *k;int e = 76 *k;
Console.WriteLine("a={0},b={1},c={2},d={3},e={4} ------h={5}\n", a, b, c, d, e, h);
}
Console.Read();
}
}
}
相信大家以后遇到类似的问题,应该会胸有成竹了。
五家共井 穷举法_经典算法题——五家共井相关推荐
- 五家共井 穷举法_五户共井问题
7623:五户共井问题 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有A, B, C, D, E五家人共用一口井,已知井深不超过k米.A, B, C, D, ...
- 五家共井 穷举法_第5讲地图着色问题.ppt
部分可行解 dominating set problem The?dominating set problem?concerns testing whether γ(G)?≤?K?for a give ...
- 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法
算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...
- 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...
- java 穷举法_C++基本算法思想之穷举法
穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...
- Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)
Python:三种方法计算最大公约数和最小公倍数 1.穷举法 2.欧几里德法 3.Stein算法 题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数: 参考资料:Python解决求最大 ...
- python算24点穷举法_关于24点去重的算法?
=== 4月12日更新 === === 先给结论吧 === 花了近一周时间用JavaScript完成了24点去重算法,源码提交到了github上:auntyellow/24 ,可以在线试:gives ...
- 百钱百鸡php穷举法,PHP经典题:百钱百鸡问题(穷举算法)
PHP经典题:百钱百鸡问题(穷举算法) 百钱百鸡问题: 已知:公鸡5元一只,母鸡3元一只,小鸡一元3只 现用100元钱买了100只鸡,问:公鸡母鸡小鸡各几只? --请考虑尽可能高效的方法 思路: 如果 ...
- python 笔试题 英方_经典算法题 :找字符串中的逆序对(百度笔试题)
脚本之家 你与百万开发者在一起 来自:百度研发工程师2015深圳笔试卷 编程题:给定一个文件每一行是字符串,找出所有的逆序对,比如abc和cba是逆序的对. 小贴士:返回上一级搜索"算法题& ...
最新文章
- 【阶段小结】协同开发——这学期的Git使用小结
- java实现动态上传多个文件并解决文件重名问题
- android之broadcast发送广播
- 赛门铁克公告:解密Kneber恶意软件
- 有时候,爱就是那么简单
- Python Django框架根据模型不能新建表
- 【重要】ES6-23 JavaScript模块化
- hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
- 15 - java 继承
- PostgreSQL相关知识概念
- 【ES】ES 好文档积累
- 下一个十年,什么样的测试会被大厂争抢?
- Android使用google breakpad之minidump_stackwalk
- java网页保存成pdf_将网页转换为PDF
- 原来长期佩戴耳机危害那么大!现在你知道还不算太晚
- ASP.NET 即时通信,WebSocket服务端实例
- 足浴按摩预约下单小程序开发制作功能介绍
- mount挂载不上,不提示任何信息
- python UI自动化自动关闭浏览器学习记录
- 进击的Objective-C-----------------类目(category),延展(Extension),协议(Protocol),代理(delegate)-委托 时间获取...