平分七筐鱼

问题描述:

甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐只装了半筐鱼,另外7筐则是空的。由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量也是相等的。

在不将鱼倒出来的前提下,怎么将鱼和筐平分三份?

 

我的代码:

x=[]
y=[]
for i in range(1,6):
    for j in range(1,6):
        k=7-i-j
        if k<=0:
            break
        else:
            x.append([i,j,k])
for yu in x:
    yu_sum=yu[0]*100+yu[1]*50+yu[2]*0
    if yu_sum==350:
        y.append(yu)
for yf1 in y:
    for yf2 in y:
        for yf3 in y:
            if yf1[0]+yf2[0]+yf3[0]==7 and yf1[1]+yf2[1]+yf3[1]==7:
                print yf1,yf2,yf3

结果:

[1, 5, 1] [3, 1, 3] [3, 1, 3]
[2, 3, 2] [2, 3, 2] [3, 1, 3]
[2, 3, 2] [3, 1, 3] [2, 3, 2]
[3, 1, 3] [1, 5, 1] [3, 1, 3]
[3, 1, 3] [2, 3, 2] [2, 3, 2]
[3, 1, 3] [3, 1, 3] [1, 5, 1]

我的思路:

已知有21个筐,三个渔夫,那么每个渔夫应分到7个筐。而且,7个筐装满了鱼(共700),7个筐装了一半的鱼(共350),7个筐没有鱼,又不能倒鱼,假设满的为100,一半的为50,空的为0,那么每个渔夫应分到(7x100+7x50+7x0)/3=350;

先保证每个渔夫有7个筐,其中第一个筐放的是100的,第二个筐放的是50的,第三个筐放的是0的,共有如下种可能(第一块的for循环):

[[1, 1, 5], [1, 2, 4], [1, 3, 3], [1, 4, 2], [1, 5, 1], [2, 1, 4], [2, 2, 3], [2, 3, 2], [2, 4, 1], [3, 1, 3], [3, 2, 2], [3, 3, 1], [4, 1, 2], [4, 2, 1], [5, 1, 1]]

根据上述关系再保证每个渔夫的鱼有350,共有如下种可能(第二块的for循环):

[[1, 5, 1], [2, 3, 2], [3, 1, 3]]

最后求出满足筐数位7且鱼有350关系的可能性:

[1, 5, 1] [3, 1, 3] [3, 1, 3]
[2, 3, 2] [2, 3, 2] [3, 1, 3]
[2, 3, 2] [3, 1, 3] [2, 3, 2]
[3, 1, 3] [1, 5, 1] [3, 1, 3]
[3, 1, 3] [2, 3, 2] [2, 3, 2]
[3, 1, 3] [3, 1, 3] [1, 5, 1]
 

示例代码:

for a in range(4):
    for b in range(min(4, 7 - a + 1, a + 1)):
        c = 7 - a - b
        if c >= 4 or c > b:
            continue
        h = map(lambda x: int((3.5 - x) / 0.5), (a, b, c))
        if sum(h) == 7:
            print '-' * 20
            for x, y in zip((a, b, c), h):
                print x, y, 7 - x - y

结果:

--------------------
3 1 3
2 3 2
2 3 2
--------------------
3 1 3
3 1 3
1 5 1
 

代码分析:

解题思路:
1.我们可以计算得知,每人应得3.5框鱼
2.穷举每人拿到整框数,a, b, c
3.计算每人应拿半框数,ah, bh, ch,
4.ah + bh + ch == 7 ?

转载于:https://my.oschina.net/jmbzs/blog/713053

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值