学编程怎么能不接触算法呢?
这是我在最近看到的一个题目,题目很简单,但是于我个人而言思维上有一个突破——有条件,要上;没有条件,创造条件也要上。话不多说,先看看题目。
有一个天平,7克、2克砝码各一个,如何只用这些物品三次将140克盐分成50克,90克各一份?
看到这里,我首先想到的是借助天平来分盐。第一次:分成两个70克。第二次:将70克盐再进行等分,分出两个35克。现在有70克,35克,35克。第三次:将35克盐再进行等分,分出两个17.5克。现在的盐有70克,35克,17.5克,17.5克四堆盐,这四堆盐组合不出50克盐,也组合不出来90克盐,所以这种方法不可行。
接下来,借助砝码来分盐。天平的一端完全是盐,另一端只有砝码,可能出现的情况有:2克、7克、9克。按最大的砝码重量来操作,操作三次最多可以得到9✖3=27克盐,达不到要求。
接下来就是我思维的突破点了,砝码的价值在于它所能衡量出来天平另一端物品的重量,不仅仅在于其本身,划重点“重量”、“重量”、“重量”。砝码可以代表重量,那么其他可以用作重量的物品也可以充当砝码的作用,比如本题中出现的盐,比如“曹冲称象”,船就是天平,石头就是砝码。7克、2克的砝码各有1个,为了能凑出50克盐,接下来就需要知道需要多少个7克、多少个2克了。用到了二元一次方程:
设x个2克,y个7克,即2x+7y=50.列出整数解:
x | y |
18 | 2 |
11 | 4 |
4 | 6 |
因为只能称3次,前两组解是无法组合出这么多次,所以只选取最后以一组解,4个2克、6个7克。
天平每操作一次,便可将重量增加一倍,分开的砝码、次数不够,所以砝码不能分开使用,需要将其进行合并。
2✖4+7✖6 =(2✖2+7✖3)✖2 = [(2+7)+(2+7) + 7 ] ✖ 2
方法一:
第一次:2克+7克=9克 的砝码放在天平的一端,称出9克盐。(用到了第一个9克)
第二次:7克砝码+9克盐放在天平的一端,称出来16克盐。(用到了第二个9克,用到了7克)
现在有25克盐。
第三次:不用砝码。将已有的25克盐放置在天平的一端,在天平的另一端称出25克盐,又得 到了25克盐。(这次用到的是,天平的翻倍效果)
总共得到了50克盐,这样剩余的盐就是90克盐了。
方法二:
第一次:用7克+2克=9克,的砝码在天平一端称出9克的盐。(用到了第一个9克)
第二次:用7克+2克=9克,再加9克盐,在天平的另一端称出18克盐。(用到了第二个9克)
这时,已经有了27克盐,但是先不将它们合并。
第三次:天平的一端是第二次得到的18克盐,加7克的砝码;在天平的另一端先放2克砝码,这样就可以得到23克盐。(这次,一端用到了7克砝码,另一端用到了2克砝码)
9+18+23=50克盐。
最后,用专业术语来讲就是搜索的过程:确定决策条件、划分阶段、状态转移,找到最优解。
有条件要上,没有条件、创造条件也要上。