我有一个关于背包问题的问题,目的和背包问题的结果非常相似问题是:
假设您有n个项目的集合所有的物品都有相同的重量,你最多可以选择其中的一个。编写一个Python函数,它给出背包、容量、列表(按升序排序)、每个项目的值、权重和W的输入,并返回背包所能容纳的最大值。
我试过写这个函数,但不知怎么的,我不知道在代码行中,w的权重在哪里合适。

def knapsack(capacity,n):
    if len(n) ==0:
          return 0
    elif n[-1][0] > capacity:
          return knapsack(capacity, n[:-1])
    else:
          return max(knapsack(capacity,n[:-1]), knapsack(capacity-n[-1][0],n[:-1]+n[-1][1]

不知怎的,我找了很多方法来解决这个问题,因为我对Python还比较陌生,但是我不喜欢代码的工作方式,因为我还没有完全解决这个问题有没有更好的方法来解决这个python函数?

最佳答案

如果它们都有相同的重量,那么这个问题就很简单了。
您只需按项目的值降序排序,然后开始从列表中选择项目,直到在值列表中没有更多的项目,或者存储更多项目的容量不足。
请注意,该问题说明值是按值的升序排序的。由于列表已经按升序排序,您可以简单地反转列表,使项目按值降序显示这将首先给您最大值的项目。
从第一个项目开始,继续选择项目,直到你不再适合他们在你的背包。

def knapsack(capacity, values):
    values.reverse()
    num_items = capacity // w
    return sum(values[:num_items])

num_items持有背包中可容纳的最大项目数。
values[:num_items]使用数组切片从数组中检索最多的num_items值,最后将其传递到sum函数,计算最大和。

10-05 17:55
查看更多