【问题标题】:Minimum number of steps to reach a given number达到给定数量的最小步数
【发布时间】:2019-09-09 22:43:03
【问题描述】:

我需要通过将值列表 l 加/减到 n 来计算从值 n 达到值 x 的最小方法数。

例如:值 n = 100,值 X = 45 列表, l,: 50,6,1

最好的方法是说: 100-50-6+1 = 45

我想要一个程序来解决给定列表 l 的任何 x 和 n 值

我真的很难概述我将如何写这个。

我对如何克服以下问题感到困惑:

  • 如果我应该尝试添加或 减法以及应该执行多少次。例如我 可能需要先减法,然后加法,再减法以达到 解决方案
  • 如何包含足够的 for/while 循环以确保我可以提供 所有可能输入值的解决方案

以前有没有人遇到过这样的问题,并且知道如何为这种解决方案概述代码(如果它有助于指导我了解可以帮助我的特定可用功能,我正在使用 Python)

谢谢

这是我目前的尝试,但我被卡住了

inputA = ""
while inputA == "":
    inputA = input("""Please enter two numbers, separated by a comma.
                The first value should indicate the number of jugs:

                The second value should indicate the volume to be measured

                """)

itemList = list(inputA.split(","))
valueToMeasure = int(itemList[1])

inputB = ""

while inputB == "":
    inputB = input("Plese enter the volumes for the {} jug(s) listed: ".format((itemList[0])))

    if len(inputB.split(",")) != int(itemList[0]):
        inputB = ""

TargetVolume = itemList[1]
jugSizes = inputB.split(",")

print("Calculating: smallest number of steps to get", TargetVolume, "ml using jugs of sizes:", jugSizes)


jugSizes.sort()
jugSizes.reverse()
largestJug = int(jugSizes[0])

ratioTable = {}
for item in jugSizes:
    firstVal = int(jugSizes[0])

    itemV = int(item)
    valueToAssign = firstVal/itemV

    ratioTable[int(item)] = int(valueToAssign)

taskPossible = True

if valueToMeasure > largestJug:
    print ("Impossible task")
    taskPossible = False

newList = jugSizes
if taskPossible == True:
    for item in jugSizes:
        if item < TargetVolume: break
        newList = newList[1:]
        newDict  = {}
        for itemA in ratioTable:
            if int(itemA) < int(item):
                newDict[itemA]= ratioTable[itemA]
        print ("Do work with these numbers:", newDict)

【问题讨论】:

  • 你有没有尝试过?展示你的努力
  • 尝试使用递归算法。
  • 听起来您应该为I 上的数学运算符创建所有排列的列表,然后查看其中哪些等同于X
  • 您是否从列表中取样,是否更换?
  • @JanChristophTerasa 我缩短了列表,正如您在每个循环结束时看到的那样

标签: python loops


【解决方案1】:

如果我理解正确,这就是我解决问题的方法。

X = 45
largest_jug = measured = 100
jug_sizes = [50, 6, 1]
steps = []
jug_to_use = 0

while measured != X:
    if jug_to_use < len(jug_sizes) - 1: # we have smaller jugs in reserve
        error_with_large_jug = min([abs(measured - jug_sizes[jug_to_use] - X), abs(measured + jug_sizes[jug_to_use] - X)])
        error_with_small_jug = min([abs(measured - jug_sizes[jug_to_use + 1] - X), abs(measured + jug_sizes[jug_to_use + 1] - X)])
        if error_with_small_jug < error_with_large_jug:
            jug_to_use += 1
    if measured > X:
        measured -= jug_sizes[jug_to_use]
        steps.append(('-', jug_sizes[jug_to_use]))
    else:
        measured += jug_sizes[jug_to_use]
        steps.append(('+', jug_sizes[jug_to_use]))
print(steps)

产量

[('-', 50), ('-', 6), ('+', 1)]

它基本上从使用最大的水壶开始,直到它在下一个尺寸的范围内,依此类推。我们可以用随机大小的 [30, 7, 1] 罐子对其进行测试,然后再次查看它会得到准确的答案 [('-', 30), ('-', 30), ('+', 7), ('-', 1), ('-', 1)]

重要提示:

  • jug_sizes 应该从大到小排序
  • 此解决方案假定X 可以通过jug_sizes 中提供的数字到达(否则它将无限循环)
  • 这并没有考虑到水壶的大小会使目标无法到达(即[50, 12, 5] 应该跳过 12 的大小,否则解决方案无法到达
  • 这假设每个水壶都应该使用(与上述有关)

我相信您可以根据您的具体情况找出所有这些问题的解决方案

【讨论】:

  • 非常感谢。惊人的!太感谢了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多