常用算法思想--分治算法
来源:互联网 发布:应收金额 英文java 编辑:程序博客网 时间:2024/05/16 23:46
分治算法
一个袋子里有30个硬币,其中一枚是假币,并且假币和真币一模一样,肉眼难以分辨,目前只知道假币比真币轻。请问如何区分出假币?
操作步骤如下:
1、首先为每个银币编号,然后将所有的银币等分为两份,放在天平的两边。这样就将区分30个硬币的问题,变为区别两堆硬币的问题。
2、因为假币的分量轻,因此天平较轻的一侧中一定包含假币。
3、在将较轻的一侧中的银币等分为两份,重复上述做法。
4、知道剩下2枚硬币,可用天平直接找出假币。
int Divide(int *coin, int low,int high){int i=0,preSum=0,nextSum=0,midSum=0;int lightCoin;if(low+1 == high){if(coin[low] < coin[high]){lightCoin = low+1;return lightCoin;}else{lightCoin = high+1;return lightCoin;}}if((high - low +1)%2 == 0) //偶数{for(i = low;i<=low+(high+low)/2;i++){preSum = preSum+coin[i];}for(i = low+(high+low)/2;i<=high;i++){nextSum = nextSum+coin[i];}if(preSum > nextSum){lightCoin = Divide(coin,low+(low+high)/2,high);return lightCoin;}else if((preSum < nextSum){lightCoin = Divide(coin,low,low+(low+high)/2);return lightCoin;}else{}}else{for(i = low;i<=low+(high+low)/2;i++){preSum = preSum+coin[i];}for(i = low+(high+low)/2;i<=high;i++){nextSum = nextSum+coin[i];}midSum = coin[low+(low+high)/2];if(preSum > nextSum){lightCoin = Divide(coin,low+(low+high)/2,high);return lightCoin;}else if((preSum < nextSum){lightCoin = Divide(coin,low,low+(low+high)/2);return lightCoin;}else{}if(preSum + midSum == nextSum + midSum){lightCoin = low+(low+high)/2 + 1;return lightCoin;}}}
- 常用算法思想--分治算法
- 常用算法思想一(分治思想)
- 常用算法思想之:分治思想
- 算法思想 -- 分治算法
- 五大常用算法的思想之一:分治算法
- 分治算法思想
- 算法之分治思想
- 常用算法 - 分治算法
- 分治的算法设计思想
- 快速排序算法-分治思想
- 分治思想之排序算法
- 常用算法 --- 分治法
- 常用算法-分治法
- 常用算法之一:分治算法
- 常用算法之分治算法
- 常用算法:(一)分治算法
- 常用算法一(分治算法)
- 动态规划算法与分治算法思想
- singleton模式的几种实现方式
- 天天渐渐热了。。。呼呼 这电脑怕会烧坏
- ruby on rails params
- 了解搜索引擎
- ANDROID NDK使用第三方静态库的方法
- 常用算法思想--分治算法
- 【数学期望】poj3682
- facebook folly 编译安装
- 我的跳槽经历
- asp.net发布网站时三个选项的问题
- 数据结构 - 二叉排序树
- 转:每一个孩子都是乔布斯
- The selected server is enabled,but is not configure .
- MakeFile 的写法(转载)