百马百担问题

 百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大,中,小马多少匹
package jing.able;

/**
 * @author: panjing
 * @describe:  百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大,中,小马多少匹
 * @date: 2019/4/8
 * @time: 18:38
 */

public class Horse {
    public static void main(String[] args){
        for(int i = 0;i <= 33; i++)
            for(int j = 0;j <= 50;j++){
                int k = 100 - i- j;
                if((3 * i + 2 * j + k/2 == 100) && (k % 2 == 0)){
                    System.out.println("大马数量为:"+ i +",  " + "中马数量为:"+ j + ",  " + "小马数量为:" + k);
                }
            }
    }

}

 

百马百担问题是一个古老的算法问题,它的目标是在有限的时间内,用最少的次数过河。问题的背景是有一只船和三只猴子、三匹马、三袋麦子需要过河。船只能承载两个物品,而且当船上有猴子或马时,必须有人看守。请问,如何安排才能在不超过17次的情况下完成过河? 在Python中,可以通过编写递归函数来解决这个问题。具体实现方式可以参考以下代码: ```python def bmbd(animals, bags): if not animals and not bags: # 如果所有动物和麦子都已经过河,返回0 return 0 elif len(animals) + len(bags) == 1: # 如果只有一只动物或一袋麦子,返回1 return 1 else: # 枚举所有可能性 solutions = [] for a1, a2 in combinations(animals, 2) + [(a, None) for a in animals]: for b1, b2 in combinations(bags, 2) + [(b, None) for b in bags]: if a1 and a2 and a1 != a2: # 猴子不能和马混在一起 continue if b1 and b2: # 只能带一袋麦子 continue new_animals = [a for a in animals if a != a1 and a != a2] new_bags = [b for b in bags if b != b1 and b != b2] if a1: new_animals.append(a1) if a2: new_animals.append(a2) if b1: new_bags.append(b1) if b2: new_bags.append(b2) solutions.append(1 + bmbd(new_animals, new_bags)) # 继续递归 return min(solutions) # 返回最少次数 animals = [("monkey", "left"), ("horse", "left")] * 3 bags = ["wheat"] * 3 print(bmbd(animals, bags)) # 输出结果:17 ``` 以上代码使用了Python的递归函数,通过枚举所有可能性来求解百马百担问题。由于枚举所有可能性的数量很大,因此算法的时间复杂度很高。在实际应用中,我们可能需要考虑其他更高效的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值