我正在尝试创建一个简单的骰子游戏。要计算分数,我必须找到总和达到特定值的所有子集,然后选择最有价值的组合。所有数字只能被选择一次。可能最容易用示例来描述:
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
。
我设法解决了“查找可能的子集”部分,但是我一直在努力寻找所找到的子集的最有价值的组合。谁能帮我? :(
答案 0 :(得分:1)
由于您已经找到了组合,因此我将专注于对它们进行分组。首先,我们需要确保我们知道两组相等。
{1,4}等于{1,4}
{1,4}等于{4,1}吗?
{1,4}与{1,1,1,2}
不同因此,您需要确保您的程序可以进行适当的比较。为此,您将需要生成组合的“签名”,即一个值(例如字符串),因此只要您对两个组是否相等感兴趣,就可以比较它们的签名。您将需要具有单数和数字的数据结构(地图),该数据结构将存储所有出现的签名及其出现的编号。每当获得组合时,都需要找出地图是否包含给定的签名。如果是这样,请增加发生次数。如果没有,则将签名添加到地图中,值为1。找到所有组合后,在地图中找到具有最大值的条目,这将是解决方案。
现在,让我们回到是否是
的问题。{1,4}等于{4,1}?
如果两者相等,则在生成组合签名之前,需要对组合的项目进行排序。如果两者不相等(这意味着我们正在处理变化),则无需对项目进行排序,只需以原始格式生成签名即可。