运白菜问题

          1、一个商人和一匹马要运送3000棵白菜到1000里外的小镇,马每次最多能运1000棵白菜,而且每走一里路要吃掉一棵白菜,问商人最多能运送多少白菜到目的地(商人自己不运送白菜)


          思路:一共有3000课白菜,来1公里运一次,每次运1000棵;

                     将3000棵都运到1公里处时要消耗5棵白菜;

                     设5x < = 1000   x = 200  即将3000棵白菜都运到200公里时,此时消耗了1000棵白菜,剩下2000棵白菜;接下来继续运;

                      此时每运1公里需要消耗3棵白菜;

                     设3y <=1000  y= 333,   即又走了333公里,消耗了999棵白菜,剩下1001棵白菜,丢掉1棵白菜,就剩下1000,直接运送到终点即可

                      最后剩下  1000 - (1000 - 200 - 333)= 533   

                   最终运送到终点就剩下533课白菜了。


         主要用到动态的数据变化来换得最少的消耗!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

商人过河问题是一个经典的逻辑谜题,通常描述为:一个商人需要将狼、羊和白菜从河的一边到对岸,但是船只能容纳商人和另外一个物品。如果商人不在场,狼会吃羊,羊会吃白菜问题在于如何安排过河的顺序,使得在任何时刻,都不会出现狼吃羊或者羊吃白菜的情况。 以下是一个简单的C语言代码示例,用于解决商人过河问题。代码使用递归的方式来尝试所有可能的过河组合,并输出一个解决方案。 ```c #include <stdio.h> typedef struct { int merchant; // 商人位置 int wolf; // 狼的位置 int sheep; // 羊的位置 int cabbage; // 白菜的位置 } State; // 检查是否安全的函数 int isSafe(int merchant, int wolf, int sheep, int cabbage) { if (wolf == sheep && merchant != sheep) return 0; // 狼和羊在一起,商人不在 if (sheep == cabbage && merchant != cabbage) return 0; // 羊和白菜在一起,商人不在 return 1; } // 输出状态的函数 void printState(State state) { printf("商人: %d, 狼: %d, 羊: %d, 白菜: %d\n", state.merchant, state.wolf, state.sheep, state.cabbage); } // 递归尝试所有可能的移动 void tryMove(State state, int move) { static int step = 0; // 检查是否到达对岸 if (state.merchant == 3) { if (isSafe(state.merchant, state.wolf, state.sheep, state.cabbage)) { printState(state); } return; } // 根据移动尝试新的状态 switch(move) { case 1: // 商人带羊过河 if (isSafe(state.merchant, state.wolf, state.sheep, state.cabbage)) { state.merchant = 3 - state.merchant; // 商人到达对岸 state.sheep = 3 - state.sheep; // 羊随商人过河 tryMove(state, move + 1); state.sheep = 3 - state.sheep; // 羊回到原岸 state.merchant = 3 - state.merchant; // 商人回到原岸 } break; // 其他情况类似处理... } } int main() { State startState = {0, 0, 0, 0}; // 初始状态,所有都在左边岸 tryMove(startState, 1); return 0; } ``` 注意,上面的代码只是一个简化的示例,没有包含所有情况的处理(比如商人带狼或白菜过河的情况),并且在实际应用中,可能需要更复杂的状态管理和递归退出条件来确保找到解决方案。此外,由于问题的复杂性,可能存在多个解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值