【问题标题】:Fractional Knapsack Algorithm Python Input Issues分数背包算法 Python 输入问题
【发布时间】:2017-12-11 00:31:22
【问题描述】:

我对 python 有了初步的了解,并且正在尝试解决这个背包算法问题。

一个示例输入/输出是:

输入:

3 50

60 20

100 50

120 30

输出:

180.000

下面是我看不懂的代码,在算法问题的起始代码文件中提供。对于之前的问题集,我一直在用 input() 替换 sys.stdin.read() 因为我更了解它。我认为它正在尝试映射输入,所以它最终是:n = 3,容量 = 50,值 = [60, 100, 120],权重 = [20, 50, 30]。

if __name__ == "__main__":
    data = list(map(int, sys.stdin.read().split()))
    n, capacity = data[0:2]
    values = data[2:(2 * n + 2):2]
    weights = data[3:(2 * n + 2):2]
    opt_value = get_optimal_value(capacity, weights, values)
    print("{:.10f}".format(opt_value))

我在堆栈的某处读到我可能需要将最后一行更改为:

print("{!s:10f}".format(opt_value))

但这产生了不同的错误

ValueError:“str”类型的对象的未知格式代码“f”。

如果您能帮助我理解或指出正确的方向,我将不胜感激。谢谢你。

【问题讨论】:

  • get_optimal_value 在哪里定义?你能把那个代码也包括进去吗?

标签: python algorithm python-3.x knapsack-problem


【解决方案1】:

你也可以使用下面的代码。

if __name__ == "__main__":
data = list(map(int, input().split()))
n, capacity = data
values = [0]*n
weights = [0]*n
for i in range(n):
    values[i], weights[i] = map(int, input().split())
opt_value = get_optimal_value(capacity, weights, values)
print("{:.10f}".format(opt_value))

【讨论】:

    【解决方案2】:
    1. 我会回到 input(),因为它更易于阅读,而且不用担心。

    2. 关于最后一行产生“'str' 类型的对象的未知格式代码'f'”的最后一点可能意味着它正在尝试格式化一个数字,但你给它一个字符串。检查 get_optimal_value() 返回的值的类型。

    3. 这是您的代码的一个非常粗略的注释版本:

      if __name__ == "__main__": #if it's the main program
      data = list(map(int, sys.stdin.read().split())) #make a list of the input, split up and turned into integers.
      n, capacity = data[0:2] #set n and capacity to the first two values in data
      values = data[2:(2 * n + 2):2] set values equal to a subsection of data. Specifically, every second character from index 2 to index (2 * n + 2).
      weights = data[3:(2 * n + 2):2] #the same as the line above, but starting at 3.
      opt_value = get_optimal_value(capacity, weights, values) #set opt_value to whatever the function returns.
      print("{:.10f}".format(opt_value)) #print the value of opt_value in a fancy way. Specifically, as a floating point number. If you're currently feeding it a string, then Python will squawk at you.
      
    4. 这里有一些有用的链接可能会有所帮助: https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3 https://pyformat.info

    希望以上部分内容对您有用。

    【讨论】:

    • 非常感谢您的帮助!我只是尝试在打印之前将 opt_value 转换为浮点数,但我收到一条错误消息,说我不能以这种方式将元组转换为浮点数。所以它看起来像一个元组。我将尝试索引,然后转换为浮点数。基本上我什么都不做时会打印这个元组:(180.0, [20, 0, 30, 0]) 我需要的是 180.000
    • 20 和 30 是增加 180 容量的权重。它为您提供价值 + 重量。 opt_value[0] 将为您提供 180。
    • 是的,成功了,谢谢! opt_value = ((opt_value[0])) print("{:.10f}".format(float(opt_value)))
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多