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

2021-06-11 21:08:55 字數 1070 閱讀 4162

說明現有八枚銀幣a b c d e f g h,已知其中一枚是假幣,其重量不同於真幣,但不知是較輕或較重,如何使用天平以最少的比較次數,決定出哪枚是假幣,並得知假幣比真幣較輕或較重。 解法

單就求假幣的問題是不難,但問題限制使用最少的比較次數,所以我們不能以單純的迴圈比較來求解,我們可以使用決策樹,使用分析與樹狀圖來協助求解。乙個簡單的狀況是這樣的,我們比較a+b+c與d+e+f ,如果相等,則假幣必是g或h,我們先比較g或h哪個較重,如果g較重,再與a比較(a是真幣),如果g等於a,則g為真幣,則h為假幣,由於h比g輕而g是真幣,則h假幣的重量比真幣輕。

**如下

#include #include #include void compare(int, int, int, int);

void eightcoins(int);

int main(void)

; int i;

srand((unsigned int)time(null));

for(i = 0; i < 8; i++)

coins[i] = 10;

printf("\n輸入假幣重量(比10大或小):");

scanf("%d", &i);

coins[rand() % 8] = i;

eightcoins(coins);

printf("\n\n列出所有錢幣重量:");

for(i = 0; i < 8; i++)

printf("%d ", coins[i]);

printf("\n");

return 0;

}void compare(int coins, int i, int j, int k)

void eightcoins(int coins)

else

if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5])

else

if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5])

}

每日一演算法 八枚銀幣

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

每天一演算法(生命遊戲)

說明 生命遊戲 game of life 為1970年由英國數學家j.h.conway所提出,某一細胞的鄰居包括上 下 左 右 左上 左下 右上與右下相鄰之細胞,遊戲規則如下 復活 如果某位置原無細胞存活,而該位置的鄰居為三個,則該位置將復活一細胞。解法 生命遊戲的規則可簡化為以下,並使用case比...

每天一演算法 約瑟夫問題

1.約瑟夫問題 問題描述 n個人 編號1 n 從1開始報數,報到m的退出,剩下的人繼續從1開始報數。按順序輸出列者編號。數學解法複雜度 o n 演算法一 數學解法 int main void return 0 演算法二 i 1 while ncounti i 1 nallcount 迴圈報數 whi...