编程之美 - 烙饼问题

本文探讨了如何解决烙饼问题,即找出将一摞大小不一的饼按大小顺序排列所需的最小翻转次数。通过穷举法和递归策略,寻找最优解。在递归过程中,优化评估值以减少搜索次数。例如,对于饼顺序为{3,1,2}的情况,最少需要翻转两次,而初始程序可能需要查找79次,优化后的程序只需51次。对于更复杂的序列如{5,1,2,4,3},优化的效果更为显著。" 103084319,9083009,51单片机实现的电子秤设计,"['单片机', '课程设计', '嵌入式硬件']
摘要由CSDN通过智能技术生成

把一摞烙饼按大的在下,小的在上拍好,一只手一次只能抓住上面的几张饼,把它们上下颠倒个个。反复几次后把饼排好。
问把饼排好需要的最小的次数。

问题:是看看把饼排好需要的最小次数。

找最优解的问题,可以想到用穷举法。
用递归的方式去遍历所有的翻转方式。然后找到最小的值。


可以先把最上面的两张翻一下,把次数加一,看看是不是达到要求了,如果没有的话再已经翻转过的基础上再继续递归。当顺序排好了,这是一个退出条件。

当然,书中做了优化,对当前饼的顺序做了评估,看看还有多少张饼处于不相邻的位置,给出一个评估值,如果当前已经执行的翻转次数+未来还需要翻转的次数 > 2(n-1)这是需要的最大的翻转次数时,也就可以直接退出了。


程序中可以关注一下 FindSwapCount的返回值,如果能优化其中算法,使其返回值尽量的大(当然要合理),这样就能大幅的减少递归的次数。

例如测试时饼大小的顺序是 {3,1,2},这个最少要翻两次。当前的程序需要查找 79次,如果将FindSwapCount的返回值变成2倍,这样需要查找
51次。

如果用{5,1,2,4,3}进行测试, 375289:39057,这个就比较明显了。

#include <iostream>

using 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值