第一次錯誤:
pos[start]=dmax;printf("dmax:%d\n",dmax);
for(i=0;i分析:漏掉了found在遞迴時仍然不符合要求的情況,應該在遞迴結束後仍然檢測found值,0則仍然回溯;新增**如下
if(!found) for(i=0;i第二次錯誤:新增**位置錯誤,導致重複回溯
pos[start]=dmax;printf("dmax:%d\n",dmax);
for(i=0;i#include #include #include #define maxposnum 15
typedef struct distance
*disset;
disset initializeq(int);
disset createq(int);
void initializearr(int );
int turnpike(disset,int );
int findmax(disset);
int deset(int,disset);
int place(int,int,disset);
int atset(int,disset);
int isempty(disset);
void enset(int,disset);
void printd(disset);
int main()
int isempty(disset d)
int place(int start,int pos,disset d)
}int atset(int ele,disset d)
void printd(disset d)
int turnpike(disset d,int pos)
else
printf("ff");
return 0;
}int findmax(disset d)
int deset(int ele,disset d)//返回被刪除的元素,即第乙個引數
void initializearr(int pos)
return d;
}disset initializeq(int n)
一點感悟:網上常看到「數學是演算法的基礎」,但是實踐以來,發現很長一段路,考察的是乙個人的邏輯和條例。學習演算法不該本末倒置「先打好數學基礎,在學習演算法」,應該遇到瓶頸時,在去學習。
另:大學期間一定要打好數學基礎,可能工科的所有學問(至少計算機),想要學到一定高度,數學和英語都是必備的。英語!!!數學!!!
回溯演算法 收費公路重建問題
通過點與點之間的距離重新構造出點集。距離集大小為n n 1 2,n為點的個數。驅動程式 include include include using namespace std bool turnpike vector x,multiset d,int n else return false 回溯部分...
回溯演算法(收費公路重建問題)
給出乙個距離的集合d,求出在x軸,存在哪些點能夠組合成這樣的距離集合 假設第乙個點在0處 path 1 0 最後乙個點是距離集合中最大的距離 path n max d 使用堆或是紅黑樹存放距離集合d include include include using namespace std bool p...
公路重建問題
1 可以知道,距離最大的一定是從第乙個點到最後乙個點的.那麼我們將第乙個點的座標定為0,最後乙個點的座標定為10.2 接下來刪除集合中的距離10,那麼該集合就是由n 1個點構成的距離集合.接下來,再去最大的距離,很顯然,距離8可以是乙個點到x0的距離,也可以是點到x6的距離.這時候有兩種情況,因此我...