我试图在今天的{/ 3}} r / dailyprogrammer上做,我对如何解决问题的实际问题感到茫然:找到合适的操作数以便“得分骰子”的总和“数字会导致目标模具的数量。我能想到的唯一方法就是强行实施。例如,找到哪些操作数将使2 4 6 8和10的总和等于16。
顺便说一句,这是我到目前为止的代码:
# r/dailyprogrammer, Intermediate #195
import random
def dice_roller(dice, sides):
'''Takes the number of dice and the number of sides, and returns a list of values accordingly.'''
if dice == 1:
return random.randint(1, sides)
else:
rs = []
for i in dice:
rs.append(random.randint(1, sides)
return rs
def math_dice(td, sdc):
'''Math dice game. Both parameters should be in that dice notation format, like 1d20 and 4d6.'''
try:
target_number = dice_roller(td.split('d'))
equation_numbers = dice_roller(sdc.split('d'))
except:
return ValueError
我希望我的问题有道理。
答案 0 :(得分:2)
子集和问题。使用暴力递归的部分答案。
让我们在问题陈述中使用示例:target = 9,dice = [1,3,1,3,5]。
我们可以通过仅检查每个函数调用中列表中的第一个骰子来递归地解决这个问题。
让我们看看第一个数字,1。
在这三种情景中,我们都会递归并应用相同的逻辑。当没有骰子时递归的基础,当且仅当目标为0时,查询才成功(因为空值为0)。
这是Python代码:
# target is an integer, dice is a list of integers, equation is a string
def solve(target, dice, equation, sum):
if len(dice) == 0:
if target == 0:
print equation + " = " + str(sum)
else:
first = dice[0]
solve(target - first, dice[1 : ], equation + " + " + str(first), sum + first)
solve(target + first, dice[1 : ], equation + " - " + str(first), sum - first)
solve(target, dice[1 : ], equation, sum)
# Example:
solve(9, [1,3,1,3,5], "", 0)
# Prints:
+ 1 + 3 + 5 = 9
+ 1 + 3 + 5 = 9
- 1 + 3 - 1 + 3 + 5 = 9
+ 3 + 1 + 5 = 9
+ 1 + 3 + 5 = 9