【问题标题】:Find all subsets that sum to a particular value and then pick the most valuable combination of those subsets找到总和为特定值的所有子集,然后选择这些子集的最有价值的组合
【发布时间】:2019-02-10 09:57:31
【问题描述】:

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

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
  • {1,4}{1,4} 值 10。由于您没有给我们任何一般性线索,只是一个例子,我试图理解这个问题。我的假设是通过 2 * (1 + 4) 得到十个,也就是说,你有两次 {1,4} 的组合。我很可能误解了这个问题,但这并不奇怪,因为您没有给出正确的规范。
  • 请出示您的编码尝试。

标签: algorithm recursion subset


【解决方案1】:

既然你已经找到了组合,我将只专注于对它们进行分组。首先,我们需要确保我们知道两个组何时相等。

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

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

{1,4} 与 {1,1,1,2} 不同

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

现在,让我们回到是否

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

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

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2012-03-27
    • 2021-07-19
    相关资源
    最近更新 更多