我正在尝试检查玩家是否不能再进行移动但我似乎无法弄清楚如何检查它。 假设我有5个或更少的瓷砖,每个瓷砖的值在1和3之间。我想要遍历瓷砖并检查是否有任何可能的组合将加起来10.它不像检查总数那么简单,因为可能有3个瓷砖,其中有3个,一个有2.我花了小时试图解决这个问题......
关于如何检查所有可能的组合的任何想法?我只需要看看是否有可能组合。一旦找到一个,我就会打破循环以减少检查次数。
编辑:如果它有帮助你可以看看我在说什么,如果你下载它。它的Numero:Android上的21。
游戏的目的是将图块添加到21个。因此,当用户使用几个图块时,即使所有图块的总数超过21,有时也无法实现21的组合,因为数字不会添加这确实产生了一个问题,因为我无法检查并告诉用户他们已经丢失了。
在检查它时,我真的不知道从哪里开始。我可以多次遍历所有的瓷砖,但是组合可以是电路板上的多个瓷砖。所以我必须检查3,然后是4,然后是5的组合,依此类推,直到达到剩余的瓷砖数量。我很难解释这一点
我为我最初的问题道歉,因为他是如此暧昧。碰巧是我在这里问过的第一个问题......这是对问题和解决方案的更好的描述。我决定保留以前的文字进行记录。
游戏中有许多编号的图块,我必须将它们添加到21才能删除。你不能超过21岁。必须准确。
我想要检查的是,是否还有一组瓷砖可以用来精确地加起来。基本的总和检查不起作用,因为你可以有5个5号牌并且超过21,但不能再消除。
由于@mellamokb回答了需要使用的子集和递归。基本上你循环遍历瓷砖,并在每个瓷砖上调用两次相同的功能。一次调用添加当前图块,另一次调用继续下一次迭代而不添加当前图块。如果任何返回true,则该函数为true。基本上是二叉树。
代码
boolean validate(tiles, index, subtotal, total){
if index >= tiles.length return false;
if subtotal == total return true;
return validate(tiles, index + 1, subtotal + tiles[index].number, total) ||
validate(tiles, index + 1, subtotal, total);
}
用
调用它validate(tiles, 0, 0, 21)
那就是它。
答案 0 :(得分:4)
这听起来像subset sum problem的变体。最简单的算法是O(2 ^ n),例如,通过使用位标志迭代每个可能的子集组合。
for i = 0 to 2^n - 1
set subtotal = 0
for each bit in i
if bit i is set, add ith element to subtotal
check subtotal against desired total (i.e., 10)
或者,使用递归:
validate(set, index, subtotal, total)
if index >= set.length return false;
if subtotal == total return true;
return validate(set, index + 1, subtotal + set[index], total) ||
validate(set, index + 1, subtotal, total);
用法:
validate(set, 0, 0, 10);