背包Python函数

背包Python函数,python,algorithm,list,recursion,knapsack-problem,Python,Algorithm,List,Recursion,Knapsack Problem,我有一个关于背包问题的问题,目标与背包问题的结果非常相似。问题是: 假设您有一组n项。所有物品的重量都相同,w,您最多可以从每个物品中选择一个。编写一个Python函数,输入背包的容量capacity,一个列表(按升序排序),每个物品的值,以及重量w,并返回背包可以容纳的最大值 我已经试着写出了这个函数,但不知何故,我无法确定权重,w,在代码行中的合适位置 def knapsack(capacity,n): if len(n) ==0: return 0 el

我有一个关于背包问题的问题,目标与背包问题的结果非常相似。问题是:

假设您有一组n项。所有物品的重量都相同,w,您最多可以从每个物品中选择一个。编写一个Python函数,输入背包的容量capacity,一个列表(按升序排序),每个物品的,以及重量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\u items]
使用数组切片从数组中检索atmost
num\u items
值,然后将其传递给
sum
函数以计算最大和