1. 问题
给定n个大小不等的圆c1,c2,…,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切,从这n个圆的所有排列中找出有最小长度的圆排列。
2. 解析
使用回溯算法求解。圆排列问题的解空间是一棵排列树,按照回溯法搜索排列树的算法框架,设开始时a=[r1,r2,……rn]是所给的n个元的半径,则相应的排列树由a[1:n]的所有排列构成。
在回溯过程中,当i>n时,算法搜索至叶节点,得到新的圆排列方案,计算当前圆排列的长度,适时更新当前最优值;当i<n时,当前扩展节点位于排列树的i-1层,此时选择下一个要排列的圆,并计算相应的下界函数。
3. 设计
void Backtrack(int i) {
if (i > n) {
计算当前圆排列长度;