分治演算法的基本思想是將乙個大的複雜的問題分解成多個小的、容易解決的問題,通過解決這些小問題進而解決這個大問題。
使用分治演算法需要待求解問題能夠簡化為若干個小規模的相同的問題,通過逐步劃分,達到乙個易於求解的階段,而直接進行求解,在程式中可以使用遞迴方法來進行求解。
哈哈,說起來很抽象,舉個例子就好理解了。
乙個袋子裡有n個硬幣,其中一枚是假幣,並且假幣和真幣一模一樣,僅憑肉眼無法區分,僅知道假幣比真幣輕一些,請問如何查詢到假幣?
我們可以這樣做:
將這n個硬幣分成兩等份,然後放到天平的兩端,則假幣在較輕的那一端;
然後將較輕的那一端的硬幣再分成2等份,然後再放到天平的兩端進行比較,假幣還是在較輕的那一段;
直到最後只剩下兩個硬幣了,分別放到天平的兩端,輕的哪乙個就是假幣。
當然,最後也可能剩下3個硬幣,我們可以將這3個硬幣中任意拿出來乙個,然後將剩下的兩個放到天平的兩端,如果天平是平的,則說明拿出來的那個硬幣就是假幣;
如果天平不是平的,則輕的那一端是假幣。
#includeusing namespace std;/**************定義查詢硬幣的函式find_false()**********************/
int find_false(int a,int low,int high)
else if(sum1+sum3==sum2+sum3) //中間的那個就是假幣!
資料結構 分治演算法求解假硬幣問題
問題描述 概念 分治演算法的基本思想是將乙個大的複雜的問題分解成多個小的 容易解決的問題,通過解決這些小問題進而解決這個大問題。使用分治演算法需要待求解問題能夠簡化為若干個小規模的相同的問題,通過逐步劃分,達到乙個易於求解的階段,而直接進行求解,在程式中可以使用遞迴方法來進行求解。哈哈,說起來很抽象...
分治思想解決演算法問題
不多bb,o n 2 include using namespace std void solve int f 5000 int m cin m for int i 0 i m i cin a i f 0 0 for int i 1 i m i f i f i 1 sum cout f m 1 en...
分治演算法解決眾數問題
題目 給定含有n個元素的多重集合s,每個元素在s 現的次數稱為該元素的重數。多重集s中重數最大的元素稱為眾數,如s 多重集s的眾數是2,其重數為3。分析 include using namespace std define m 100 int a m int num,val,n 重數,眾數,個數 v...