问题描述
我将从我编造的心理练习开始,使我想做的事情更容易解释,不那么晦涩。
假设我知道一家名为 FRUITS 的商店,它拥有无限数量的目前已知的每种水果1。
假设我有一台机器,它使用复杂的组合逻辑将任意一组 M=4 项从 FRUITS 转换为一个对象,而不是在我给的 4 个中 2。 我可以通过给它 4 个名称来测试我将获得的输出类型,而不会用完水果。
我请朋友进入FRUITS,摘水果总数>= M(至少有 2 种类型),他们会给我他们选择的每种水果的名称和计数(例如 {Apple: 1,Banana: 3,... }
或 [Apple,Banana,...]
和[1,3,...]
).
我想创建一个有效的算法(可以使用任何语言来说明)来找到所有唯一输入我可以给我的机器而无需检查所有M strong>-combinations 或使用一对列表 3 列出每个水果(即按字典顺序)。 我想不递归地执行此操作,因为列表可能相当大 4。
我目前拥有的函数将 names
作为一个列表,将 counts
作为另一个相同长度的列表(比如 N
)5。我希望最终版本输出一个 m
列表的列表,它们的长度等于唯一组合的数量(在我之前的类比中 m
=4);这些列表将保存 names
/counts
列表的索引(用于说明的伪代码 - 请注意以下返回值 1-indexed):
function (names: [A,B,C],counts: [2,2,1],m = 4) {
// ...
return [
[1,1,[1,[2,2],3]
]
// Transposed matrix form to clearly show the 3 combinations (substituted names for indices)
//
// A A B B
// A B B C
// A A B C
}
(我选择返回 m
列表的原因是因为 m
以后很有可能成为一个常量)
这实际上是我想做的一个涉及组合优化的更大项目的一部分——即真正的目标是找到最大化/最小化列表中项目共享的定量属性总和所需的组合(例如最大限度地提高维生素 C)。但我觉得这个问题本身太宽泛或太难,所以我从我认为的第一步开始。
1 在这个世界上,所有同名的水果都完全相同(例如,任何一个苹果都等同于另一个苹果)。
2 为简单起见,您可以假设输出不在 FRUITS 中。
3 如果在找到组合时可以有效地集成回调或代码块(例如,使用我的水果转换器进行测试并创建地图),则可以获得奖励积分。
4我实际上有一个递归版本可以工作,但我希望有一个更有效的算法,因为看起来我将在 Lua 中工作
5 完整性检查在这里并不重要,因为输入将被事先检查
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)