尋找假銀幣演算法

2021-07-26 17:38:42 字數 1330 閱讀 1587

尋找假銀幣是乙個非常有趣的智力題目,尋找假銀幣的大意如下: 現在有8 枚銀幣,其中有一枚是假幣。但是,從外觀和做工上無法分辨哪枚是真幣哪枚是假幣,

只知道假幣的重量要比真幣稍輕。要求僅使用乙個天平,如何以最少的步驟尋找到假銀幣。

先來分析一下尋找假銀幣問題。其實尋找假銀幣並不難,一種最基本的方法便是給硬幣編上序 號 ( 1〜8),然後通過天平進行兩兩比較,操作步驟如下: (1)首先比較第1枚銀幣和第2 枚銀幣的重量,如果天平兩邊平衡,則進行下一步操作,否則 

較輕的一邊的硬幣為假幣。 (2)接著比較第3 枚銀幣和第4 枚銀幣的重量,如果天平兩邊平衡,則進行下一步操作,否則 

較輕的一邊的硬幣為假幣。 ( 3 ) …… 重複以上步驟,直到8 枚銀幣都比較完為止,便可以找到假銀幣。這種兩兩比較的方法簡單,

但是效率不高,需要的步驟比較多。我們需要尋找最少的操作步驟。

可以採用遞迴分治的思想來求解這個問題,操作步驟如下: (1) 首先為每個銀幣編號,然後將所有的銀幣等分為兩份,放在天平的兩邊。 (2) 因為假銀幣的分量較輕,因此天平較輕的一側中一定包含假銀幣。 (3)再將較輕的一側中的硬銀幣等分為兩份,重複上述的做法。 (4)直到剩下2 枚硬銀幣,可用天平直接找出假銀幣來。這種方法在銀幣個數比較多時便顯示出了優勢。我們可以按照這個思路來編寫相應的尋找假銀 幣問題的求解演算法

c++示例**如下:

#include

using namespace std;

const int n = 111;

//這裡可以隨便指定假幣的位置

void init(int *p)

else}}

int caculate(int *p, int left, int right)

else

}if ((right - left + 1) % 2 == 0)

for (int i = (right + left) / 2 + 1; i <= right; i++)

if (leftsum < rightsum)

else

}else  //奇數個

for (int i = (right + left) / 2; i <= right-1; i++)

if (leftsum < rightsum)

if (leftsum > rightsum)

if (leftsum == rightsum) }}

void main() ;

init(p);

cout << caculate(p, 0, n - 1) << endl;

system("pause");

}

銀幣組合演算法分析

題目 有足夠量的2分 5分 1分硬幣,請問湊齊1元錢有多少種方法?此題乍看上去,只會覺得完全無法入手,但是按照由簡至繁的思路,我們可以先考慮極端簡單的情況,假如把問題規模縮小成 有足夠量的1分硬幣,請問湊齊1分錢有多少種方法?毫無疑問,答案是1。得到這一答案之後,我們可以略微擴大問題的規模 有足夠量...

每日一演算法 八枚銀幣

說明現有八枚銀幣a b c d e f g h,已知其中一枚是假幣,其重量不同於真幣,但不知是較輕或較重,如何使用天平以最少的比較次數,決定出哪枚是假幣,並得知假幣比真幣較輕或較重。解法單就求假幣的問題是不難,但問題限制使用最少的比較次數,所以我們不能以單純的迴圈比較來求解,我們可以使用決策樹 de...

每天一演算法(八枚銀幣)

說明現有八枚銀幣a b c d e f g h,已知其中一枚是假幣,其重量不同於真幣,但不知是較輕或較重,如何使用天平以最少的比較次數,決定出哪枚是假幣,並得知假幣比真幣較輕或較重。解法 單就求假幣的問題是不難,但問題限制使用最少的比較次數,所以我們不能以單純的迴圈比較來求解,我們可以使用決策樹,使...