- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设有一个七口之家,比如说,
["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/
今天小米米家官方微博宣布,小米手表尊享版开启限量定金预售,3 月 3 日早 10 点起支付尾款。购买即赠 399 元小米真无线蓝牙耳机 Air 2。 小米手表尊享版相比普通版核心没有变化,采用
今天下午,小米官方公布了小爱触屏音箱Pro 8,可以看到触控屏幕尺寸比较大,音箱上“长”了一个平板。据悉,小米小爱触屏音箱Pro 8具有白色的配色设计,下方有一个长条状的扬声器,上方带有一个尺寸比较
我是一名优秀的程序员,十分优秀!