《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q09)

《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~

在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)

Q09 落单的男女

    人们聚集在某个活动会场上,根据到达会场的顺序排成一排等待入场。假设你是活动的主办人员,想把人们从队列的
某个位置分成两组。
    你想要让分开的两组里每一组的男女人数都均等,但如果到场顺序不对,可能出现无论怎么分,两组都不能男女均等的情况。
    举个例子,有 3 位男性、 3 位女性以“男男女男女女 ” 的 顺 序 到 场, 如图所示,无论从队列的那个位置分开,两组的男女人数都不均等。但如果到场顺序为“男男女女男女”,那么只需要在第 4 个人处分组就可以令分开的两组男女人数均等了。

                                                    

问题
       求男性 20 人、女性 10 人的情况下,有多少种到场顺序会导致无论怎么分组都没法实现两组男女人数均等?(原书,感觉有问题!)

       看原书分析,比较合理的问题应该是:

        求男性20人、女性10人的情况下,有多少种到场顺序会导致无论怎么分组都没有任何一组内部男女人数能够均等?

分析图:

 

问题可简化为:从0点至蓝点,不经过红点,有多少种可能?

利用最短路径的思路:

                              

man_number = 20
female_number = 10

man_number += 1
female_number += 1
array = [[0]*man_number for i in range(female_number)]
array[1][0] = 1
array[0][1] = 1
for man in range(man_number):
    for female in range(female_number):
        if (man != female) and (man_number-man != female_number-female):
            try:
                if man > 0:
                    array[female][man] += array[female][man-1]
                if female > 0:
                    array[female][man] += array[female-1][man]
            except IndexError:
                pass
result = array[female_number-2][man_number-1] + array[female_number-1][man_number-2]
print("有%s种" % result)

运行结果:

            有2417416种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值