n枚硬幣問題(假幣問題) 分治法(減治法)

2021-09-29 21:02:50 字數 1471 閱讀 7693

1、8枚硬幣問題

在8枚外觀相同的硬幣中,有一枚是假幣,並且已知假幣與真幣的重量不同,但不知道的是假幣與真幣相比較是輕還是重。可以通過一架天平來比較兩組硬幣:

減治法將原問題一分為三,8枚硬幣分別表示a,b,c,d,e,f,g,h,從8枚中取6枚在天平兩端各放3枚比較,三種結果:

a+b+c>d+e+f

a+b+c=d+e+f

a+b+c如下所示判定樹是完整表示整個判定過程:

**就比較好寫,直接按照判定樹的過程即可:

/*8枚硬幣中有一枚為假幣,不知假幣是輕是重,

天平只能比較輕重(元素只能相加和比較)*/

#includebool v;

int index;

int eightcoin(int b)

else if(a==h)

} else if(a+e==d+b)

else if(c==h)

} else

else if(b==h)

} }else if(a+b+c==d+e+f)

else if(g==a)

} else if(ga)

else if(h==a)

} }else

else if(e==h)

} else if(a+e==d+b)

else if(f==h)

} else

else if(d==h)

} }}int main()

/*1 1 1 1 1 1 1 2

3 3 3 1 3 3 3 3

5 3 3 3 3 3 3 3

*/

2、拓展——n枚硬幣問題n枚硬幣中有1枚假幣,n枚硬幣中有一枚為假幣,不知假幣是輕是重,天平只能比較輕重(元素只能相加和比較),減治法將問題一分為三:

#include#define inf 10000

//可優化剪枝 找到即停止(其他優化方法)

int eightcoin(int b,int n,int v)

else if(s1==s2)

else

return d;

}int main(){

int b[100],d,n,v=0;

printf("input n:\n");

scanf("%d",&n);

printf("input the quality of n coin(the quality of the fake coin isnot beyond 10000):\n");

for(int i=0;i正如**注釋,還可以有很大的優化,等有時間再來。ps:這是演算法設計與分析的實驗報告

n枚硬幣問題

大致說一下問題,就是在n枚硬幣中存在乙個假幣,但不知道假幣比真幣中還是輕,你只有乙個天秤,要你用最少的比較次數找到假幣在哪。本來的思路是不斷二分,如果硬幣是偶數枚,那恰好能分成兩份,第一次分成的這兩份肯定乙份重乙份輕,並且無法判斷假幣在哪乙份裡。但如果把第乙份再二分,如果重量相等的話,假幣肯定在第一...

N枚硬幣問題

問題定義 已知n枚硬幣質量,其中有一枚假幣 或輕或重 請找出假幣 思路 若n 3,無法判斷 若範圍縮小至一枚硬幣,拿一枚真幣比較輕重 若範圍縮小至兩枚硬幣,拿一枚真幣與其中一枚比較輕重,縮小範圍至一枚硬幣 若範圍在三枚以上,將硬幣三分,左邊num 3枚,右邊num 3枚,其餘放中間 num為範圍大小...

主元素問題 減治法

乙個有n個元素的序列a中,出現次數大於n 2的元素稱為主元素。現給定乙個序列 保證存在主元素 求其主元素 以下假設a的主元素存在,且出現了k次,則其他元素出現的次數為n k,二者的差記為c 2k n。可知x為主元素當且僅當 c 0。1.若 x 確實為a的主元素,則a剪去字首p後得到的字尾s,x的個數...