- 最小重量机器设计问题
1.1解空间(说白了就是所有可能的方案)
想象你要给电脑买配件:CPU、显卡、内存。
每个配件有3家店可以选(A店、B店、C店),价格和重量都不同。
解空间就是所有购买方案的集合。
比如:
-方案1: CPU-A,显卡-A,内存-A
-方案2: CPU-A,显卡-A,内存-B
-方案3: CPU-A,显卡-A,内存-C
……一直到最后……
-方案27: CPU-C,显卡-C,内存-C
如果有n个配件,每个有m家店可选,那总共有 m^n 种买法。这就是解空间,所有可能的购物清单。
1.2解空间树(就是画出来长什么样)
画个树状图,就像做选择题:
第一层问题:CPU选哪家店?
-选A店(进入A分支)
-选B店(进入B分支)
-选C店(进入C分支)
第二层问题:显卡选哪家店?
每个CPU选择下面,又有3个选择……
这样一层层下去,最后到叶子节点,就是一套完整的购买方案。
这棵树特别容易爆炸(指数级增长),所以不能傻傻地全查一遍。
1.3每个结点的状态值(走到这一步要知道什么)
当你走到树的某个节点时(比如已经选了CPU和显卡),你需要知道:
1.当前花了多少钱——如果已经超预算了,后面就不用看了
2.当前总重量是多少——用来和目前找到的最好方案比较
3.已经选了哪些店的配件——记录路径
4.还能多轻(估算)——如果最理想的情况都比现在找到的重,就放弃
比如你选了CPU-A(100元,2kg)和显卡-B(200元,3kg),那当前状态就是:花了300元,总重5kg。
2.我对回溯算法的理解
回溯就是“聪明地穷举”。
像什么?
就像玩迷宫:
1.先随便选条路走到底
2.发现是死路,就退回上一个岔路口
3.换个方向继续走
4.边走边在脑子里记:这条路我试过,不通
核心思想
递归试探 + 及时止损
往前走的时候(深度优先):
-试试这个选择
-更新状态(花了多少钱、多重)
-继续选下一个配件
发现不行就回头:
-超预算了?退!
-已经比找到的最重方案还重?退!
-所有店都试过了?退!
为什么比纯暴力好?
因为会“剪枝”——提前放弃没希望的路径。
比如你买CPU就花了90%的预算,后面显卡内存根本买不起,那CPU这个选择下面的所有分支都不用看了。
个人看法
回溯法很实用,特别是当:
-问题规模不大不小(纯暴力不行,但有办法剪枝)
-需要找到所有解或最优解
-解的结构是“一步步做选择”的类型
关键在于设计好的剪枝条件,这决定算法效率。有时候一个巧妙的剪枝能让程序从跑几天变成跑几秒。

浙公网安备 33010602011771号