分治法-找假币问题
一、分治法
將一個復雜的問題分為規模較小的問題,計算簡單的小問題求解,然后綜合小問題,得到最終的答案。
基本思路
- 對于一個規模為N的問題,若該問題可以很容易的解決,則直接解決,否則執行下面操縱
- 將該問題分解成M個規模較小的問題,這些子問題互相獨立,并且與原問題形式相同
- 地柜的求解子問題
- 然后將各個問題的解合并到原問題的解
二、假幣問題
假幣問題:有n枚硬幣,其中有一枚是假幣,己知假幣的重量較輕。現只有一個天平,要求用盡量少的比較次數找出這枚假幣。
分析
- 首先為每個幣編號,然后將所有的幣等分為兩份,放在天平的兩邊。這樣就將區分假幣的問題變為區別兩堆幣的問題。
- 因為假幣分量較輕,因此天平較輕的一側中一定包含假幣。
- 再將較輕的一側中幣等分為兩份,重復上述做法。
- 直到剩下兩枚銀幣,便可用天平直接找出假幣。
java程序算法
public class CheckMoney {public static void main(String[] args) {int[] arr = {2,2,2,2,2,1};int pos = checkMoney(arr, 0, arr.length - 1);System.out.println("位置:"+pos);}//檢查public static int checkMoney(int arr[],int left,int right) {int sum1 = 0, sum2 = 0, sum3 = 0;if ((right - left + 1) % 2 == 0) {//數組為偶數if (left + 1 == right) {if (arr[left] < arr[right]) {//當前剩下兩個數,進行比較return left;} else {return right;}} else {//數組里面多于2個數int mid = (right - left + 1) / 2 + left;//找出中間位置for (int i = left; i < mid; i++) {sum1 += arr[i];//中間靠左的數組集合總和sum2 += arr[right - (i - left)];//中間靠右的數組集合總和}if(sum1<sum2){return checkMoney(arr,left,mid-1);}else {return checkMoney(arr,mid,right);}}} else {//數組為奇數int mid = (right - left) / 2 + left;//找出中間位置for (int i = left; i < mid; i++) {sum1 += arr[i];//中間靠左的數組集合總和sum2 += arr[right - (i - left)];//中間靠右的數組集合總和}if(sum1<sum2){return checkMoney(arr,left,mid-1);}else if(sum1>sum2) {return checkMoney(arr,mid+1,right);}else {return mid;}}} }總結
- 上一篇: 无线局域网WLAN的入门概念
- 下一篇: 2017-2018-2 20179215