gpt4 book ai didi

algorithm - 我怎么知道谁可以在圣诞节给谁送礼物?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:37:23 25 4
gpt4 key购买 nike

假设有一个七口之家,比如说,

["John", "James", "Jenna", "Joseph", "Jane", "Jacob", "Joanne"]

他们都在为圣诞节送礼季做准备。他们已就一些规则达成一致,以确保一切顺利进行:

  • 每个人都必须送一份礼物。
  • 每个人都必须收到一份礼物。
  • 任何人不得将礼物送给自己。
  • 任何人不得向其配偶赠送礼物。 (简和约翰是配偶)
  • 任何人都不能再给他去年给过的人。 (去年,约翰给了詹姆斯,詹姆斯给了珍娜,珍娜给了约瑟夫,约瑟夫给了简,简给了雅各布,雅各布给了乔安妮,乔安妮给了约翰)
  • 最后,没有两个人可以互相赠送礼物。例如,如果约翰给珍娜,珍娜可能不会还给约翰。

由于规则如此复杂,他们很难弄清楚谁可以在遵守这些规则的情况下给谁。因此,他们聘请我编写一个程序,显示人们可以相互给予的所有可能的合法方式。

我可以使用什么算法来优雅地解决这个问题?

最佳答案

我会使用一个简单的回溯算法。使用 Python 生成器函数:

def calc_gifts(names, blacklist, gifts={}):
if len(names) > 0:
name, rest = names[0], names[1:]
for other in names + list(gifts):
if (other != name and
other not in blacklist[name] and
(other not in gifts or gifts[other] != name) and
other not in gifts.values()):

gifts_new = dict(gifts.items() + [(name, other)])
for solution in calc_gifts(rest, blacklist, gifts_new):
yield solution
else:
yield gifts

现在,我们设置名称和黑名单并让生成器生成解决方案:

all_names = ["john", "james", "jenna", "joseph", "jane", "jacob", "joanne"]
blacklist = {"john": ["james", "jane"],
"james": ["jenna"],
"jenna": ["joseph"],
"joseph": ["jane"],
"jane": ["jacob", "john"],
"jacob": ["joanne"],
"joanne": ["john"]}
generator = calc_gifts(all_names, blacklist)
solution = next(generator)

solution 然后是送礼者和收礼者的 dict,例如{'joanne': 'joseph', 'james': 'john', 'jane': 'joanne', 'joseph': 'jacob', 'jacob': 'jane', 'john': 'jenna ', 'jenna': 'james'.

对于第一个解决方案,即使用 next(generator)calc_gifts 仅被调用 10 次;对于所有 224 个解决方案,例如使用 list(generator) 它被调用大约。 1000 次。

关于algorithm - 我怎么知道谁可以在圣诞节给谁送礼物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com