我正在寻找一种有效的算法来执行以下操作。
给出字母计数表/词典
counts = {'a': 3, 'b': 2, 'd': 2, 'e': 2, 'k':2, 'r': 2 }
和M个单词的列表
words = ['break, 'add', 'build' ... ]
编写一个使用所有字母(和列表中的单词)查找N个单词的函数
>>> find_words(counts, words, 3)
['break', 'break', 'add']
天真地翻遍所有单词的方法太慢了(我认为是O(m ^ n))。
答案 0 :(得分:1)
这个问题使人感到很NP。因此,我希望没有真正有效的解决方案。
因此,我建议您尝试将其简化为一个已知问题,然后解决该问题。特别是,您可以将其转换为整数线性规划问题。解决这些问题的方法通常非常好。而且每个your program has undefined behaviour都有一些相对容易使用的数字。
您要解决的特定问题是这个。您正在尝试找到一个m
整数x_i
的向量,使得0 ≤ x_i
,sum(x_i) ≤ n
以及每个字母l
等于字母已被使用,不超过您的数量。您要最大化的目标函数是x_i * (1 + len(w_i))
的总和,其中w_i
是第i
个词。
这将始终产生答案。当且仅当目标函数为n
加上可用字母数时,您才能获得答案。如果目标函数小于该函数,则不存在解决方案。