查找导致特定整数的方程式Python

时间:2014-12-31 22:42:14

标签: python

我试图在今天的{/ 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

我希望我的问题有道理。

1 个答案:

答案 0 :(得分:2)

子集和问题。使用暴力递归的部分答案。

让我们在问题陈述中使用示例:target = 9,dice = [1,3,1,3,5]。

我们可以通过仅检查每个函数调用中列表中的第一个骰子来递归地解决这个问题。

让我们看看第一个数字,1。

  • 如果我们将这个骰子用作正数,那么剩下的目标是8,骰子是[3,1,3,5]。
  • 如果我们将此模具用作负数,则剩余目标为10,骰子为[3,1,3,5]。
  • 如果我们跳过这个骰子,那么剩下的目标仍然是9,骰子是[3,1,3,5]。

在这三种情景中,我们都会递归并应用相同的逻辑。当没有骰子时递归的基础,当且仅当目标为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