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的個數...