日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分治法-找假币问题

發布時間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治法-找假币问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、分治法

將一個復雜的問題分為規模較小的問題,計算簡單的小問題求解,然后綜合小問題,得到最終的答案。

基本思路
  • 對于一個規模為N的問題,若該問題可以很容易的解決,則直接解決,否則執行下面操縱
  • 將該問題分解成M個規模較小的問題,這些子問題互相獨立,并且與原問題形式相同
  • 地柜的求解子問題
  • 然后將各個問題的解合并到原問題的解

二、假幣問題

假幣問題:有n枚硬幣,其中有一枚是假幣,己知假幣的重量較輕?,F只有一個天平,要求用盡量少的比較次數找出這枚假幣。

分析
  • 首先為每個幣編號,然后將所有的幣等分為兩份,放在天平的兩邊。這樣就將區分假幣的問題變為區別兩堆幣的問題。
  • 因為假幣分量較輕,因此天平較輕的一側中一定包含假幣。
  • 再將較輕的一側中幣等分為兩份,重復上述做法。
  • 直到剩下兩枚銀幣,便可用天平直接找出假幣。
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;}}} }

總結

以上是生活随笔為你收集整理的分治法-找假币问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。