查找所有总和达到特定值的子集,然后选择这些子集的最有价值的组合

时间:2019-02-10 09:57:31

标签: algorithm recursion subset

我正在尝试创建一个简单的骰子游戏。要计算分数,我必须找到总和达到特定值的所有子集,然后选择最有价值的组合。所有数字只能被选择一次。可能最容易用示例来描述:

Values =  {1, 1, 1, 2, 4, 4}

Target value = 5

Possible subsets = {1, 1, 1, 2} and {1, 4}

现在可以选择:

{1, 1, 1, 2} (= worth 5)

{1, 4} {1, 4} (= worth 10)

因此,在此示例中,我希望算法返回10而不是5

我设法解决了“查找可能的子集”部分,但是我一直在努力寻找所找到的子集的最有价值的组合。谁能帮我? :(

1 个答案:

答案 0 :(得分:1)

由于您已经找到了组合,因此我将专注于对它们进行分组。首先,我们需要确保我们知道两组相等。

{1,4}等于{1,4}

{1,4}等于{4,1}吗?

{1,4}与{1,1,1,2}

不同

因此,您需要确保您的程序可以进行适当的比较。为此,您将需要生成组合的“签名”,即一个值(例如字符串),因此只要您对两个组是否相等感兴趣,就可以比较它们的签名。您将需要具有单数和数字的数据结构(地图),该数据结构将存储所有出现的签名及其出现的编号。每当获得组合时,都需要找出地图是否包含给定的签名。如果是这样,请增加发生次数。如果没有,则将签名添加到地图中,值为1。找到所有组合后,在地图中找到具有最大值的条目,这将是解决方案。

现在,让我们回到是否是

的问题。

{1,4}等于{4,1}?

如果两者相等,则在生成组合签名之前,需要对组合的项目进行排序。如果两者不相等(这意味着我们正在处理变化),则无需对项目进行排序,只需以原始格式生成签名即可。