12个金币的问题

[url]http://www.iteye.com/post/475217[/url]

现在有12个金币,其中一个有质量问题(或重或轻),还有一个无砝码的天平,让你称三次怎么样找到那个有质量问题的金币?

这个题目是比较经典的智力题,俺记得第一次解这个题目是学二叉树的时候,俺当时死活要跟二叉树联系起来,汗

一种解法:

第一个量重比较是 4 对 4

考虑以下两个可能:

A) 左边比较重
B) 两边一样重

若是 A),那么假的金币就在天秤上,即是说余下的金币全都是真的,为了方便,把金币命名如下:

H1, H2, H3, H4, L1, L2, L3, L4, R1, R2, R3, R4

当中 H1, H2, H3, H4 是在重的一端的金币; L1, L2, L3, L4 是在轻的一端的金币;而 R1, R2, R3, R4 就是余下的真金币。在这情形下,有两个可能性:假的金币较重而且是 H1, H2, H3, H4 的其中一个;或者假的金币较轻而且是 L1, L2, L3, L4 的其中一个

第二个量重比较是这样的:

H1,H2,L1,L2 对 H3,L3,R1,R2

有 3 个可能性:

C) 左边较重
D) 右边较重
E) 两边一样重

若是 C),那么假金币只可能是 H1, H2 或 L3 ,最后的量重是 H1 对 H2,就可以得出答案了

若是 D),那么假金币只可能是 L1, L2 或 H3,最后的量重是 L1 对 L2,就可以得出答案了

若是 E),那么假金币只可能是 H4 或 L4,最后的量重是 H4 对 R1,就可以得出答案了

到此 A) 这个可能是完成了

现在处理 B),这时天秤上的金币都是真的,假的金币就在余下的金币內,以以下方法把金币命名:

R1, R2, R3, R4, R5, R6, R7, R8, U1, U2, U3, U4

当中 R 是真的金币,U 是余下的金币。

第二次量重是这样的:

R1, R2, R3 对 U1, U2, U3

有两个可能:

F) 左边较轻
G) 两边一样重

若是 F),那么假金币就是较轻的,而且是在 U1, U2, U3 之中。最后比较 U1 和 U2 就知道答案了。

若是 G),那么 U4 就是假金币但还未知道这个金币是较重还是较轻,只需把它和其中一个真金币比较一下就知道了。
要编写一个获得最多金币的算法代码,首先需要明确问题的具体场景和约束条件。假设我们有一个简单的场景:在二维网格中,每个格子都有一个金币数量,我们需要找到一个路径,使得路径上经过的格子中的金币总和最大。 我们可以使用动态规划来解决这个问题。以下是一个简单的实现: ```python def max_coins(grid): if not grid or not grid[0]: return 0 rows, cols = len(grid), len(grid[0]) dp = [[0] * cols for _ in range(rows)] # 初始化第一行 dp[0][0] = grid[0][0] # 初始化第一列 for i in range(1, rows): dp[i][0] = dp[i-1][0] + grid[i][0] # 初始化第一行 for j in range(1, cols): dp[0][j] = dp[0][j-1] + grid[0][j] # 动态规划 for i in range(1, rows): for j in range(1, cols): dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j] return dp[rows-1][cols-1] # 示例使用 grid = [ [0, 3, 1, 1], [2, 0, 0, 4], [1, 5, 3, 1] ] print(max_coins(grid)) # 输出 12 ``` ### 解释 1. **初始化**:首先检查网格是否为空。如果网格为空,返回0。 2. **动态规划表**:创建一个与网格大小相同的动态规划表`dp`,用于存储每个位置的最大金币数。 3. **初始化第一行和第一列**:因为只能向右或向下移动,所以第一行和第一列的最大金币数只能由前一个位置的金币数累加得到。 4. **动态规划过程**:从第二行第二列开始,每个位置的最大金币数由其上方和左方的最大值加上当前格子的金币数。 5. **返回结果**:最终结果存储在`dp`表的右下角。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值