給出乙個距離的集合d, 求出在x軸,存在哪些點能夠組合成這樣的距離集合;
假設第乙個點在0處:path[1] = 0;
最後乙個點是距離集合中最大的距離:path[n] = max(d);
使用堆或是紅黑樹存放距離集合d;
#include
#include
#include
using namespace std;
bool place
(vector<
int>
& path, multiset<
int>
& d,
int n,
int left,
int right)}if
(i == left)}if
(i == n +1)
else
return true;
} path[left]
= path[n]
- path[right]
;for
(i =
1; i < left; i++)}
if(i == left)}if
(i == n +1)
else
return true;}}
return false;}}
bool turnpike
(vector<
int>
& path, multiset<
int>
&d,int n)
return0;
}int
main()
;int len =
sizeof
(arr)
/sizeof
(arr[0]
);for(
int i =
0; i < len; i++
) d.
insert
(arr[i]);
int n =6;
vector<
int>
path
(n+1);
turnpike
(path, d, n)
;for
(auto x: path)
cout << x << endl;
return0;
}
回溯演算法 收費公路重建問題
通過點與點之間的距離重新構造出點集。距離集大小為n n 1 2,n為點的個數。驅動程式 include include include using namespace std bool turnpike vector x,multiset d,int n else return false 回溯部分...
收費公路重建問題,回溯 遞迴
第一次錯誤 pos start dmax printf dmax d n dmax for i 0 i分析 漏掉了found在遞迴時仍然不符合要求的情況,應該在遞迴結束後仍然檢測found值,0則仍然回溯 新增 如下 if found for i 0 i第二次錯誤 新增 位置錯誤,導致重複回溯 po...
公路重建問題
1 可以知道,距離最大的一定是從第乙個點到最後乙個點的.那麼我們將第乙個點的座標定為0,最後乙個點的座標定為10.2 接下來刪除集合中的距離10,那麼該集合就是由n 1個點構成的距離集合.接下來,再去最大的距離,很顯然,距離8可以是乙個點到x0的距離,也可以是點到x6的距離.這時候有兩種情況,因此我...