分治法具体实例

分治法——见名知意,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的原则就是互相独立且与原问题相同。

下面我们就用具体的例子来理解分治法的算法思想。

例题:一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻。现有一台可用来比较两组硬币重量的仪器,请使用分治法设计一个算法,可以找出那枚伪造的硬币。

我们简单的分析一下这个问题,我们采用一个五五开的思想(类似于二分法)

我们先将16枚硬币分为左右两个部分,各为8个硬币,分别称重,必然得出一半儿轻一半儿重,而我们要的就是轻的那组,重的舍去。接下来我们继续对轻的进行五五分,直至每组剩下一枚或者两枚硬币,这时我们的问题自然就解决了,下面用一张图进行更好的理解。


代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ARRAY_SIZE 16 
#define TRUE       1
#define FALSE      0

int CallTimes = 0;
int TrueCoinWeight, FakeCoinWeight;

// 生成包含 'N' 个硬币重量的数组( 含 1 枚伪币 ), 并返回伪币位置 ...
int CreateRandomCoinWeightArray( int *p, int N 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值