尋找假銀幣是乙個非常有趣的智力題目,尋找假銀幣的大意如下: 現在有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,已知其中一枚是假幣,其重量不同於真幣,但不知是較輕或較重,如何使用天平以最少的比較次數,決定出哪枚是假幣,並得知假幣比真幣較輕或較重。解法 單就求假幣的問題是不難,但問題限制使用最少的比較次數,所以我們不能以單純的迴圈比較來求解,我們可以使用決策樹,使...