Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 背包,要求从多套物品中各挑选一件_Python_Algorithm_Dynamic Programming_Knapsack Problem - Fatal编程技术网

Python 背包,要求从多套物品中各挑选一件

Python 背包,要求从多套物品中各挑选一件,python,algorithm,dynamic-programming,knapsack-problem,Python,Algorithm,Dynamic Programming,Knapsack Problem,我了解基本原理及其解决方案。我试图通过0-1问题的一个变体进行推理,在这个变体中,不能从单个列表中选择任何项目组合,而必须从多组不同的项目中分别选择一个项目 例如,在我的问题中,项目列表如下所示: 食物 香蕉(重量9,价值10) 面包(重量3,价值25) 苹果(重量4,价值30) 衬衫 T恤(重量2,价值20) 纽扣衬衫(重量3,价值25) 裤子 卡其布(重量4,价值30) 牛仔裤(重量2,价值30) 以此类推,问题要求你从食物中选择一种,从衬衫中选择一种,从裤子中选择一种,以

我了解基本原理及其解决方案。我试图通过0-1问题的一个变体进行推理,在这个变体中,不能从单个列表中选择任何项目组合,而必须从多组不同的项目中分别选择一个项目

例如,在我的问题中,项目列表如下所示:

食物
  • 香蕉(重量9,价值10)
  • 面包(重量3,价值25)
  • 苹果(重量4,价值30)
衬衫
  • T恤(重量2,价值20)
  • 纽扣衬衫(重量3,价值25)
裤子
  • 卡其布(重量4,价值30)
  • 牛仔裤(重量2,价值30)
以此类推,问题要求你从食物中选择一种,从衬衫中选择一种,从裤子中选择一种,以此类推

我想我有一个蛮力解决方案,它是我从Rosetta代码中修改的,看起来很有效(见下文),但我很难想出如何创建一个更有效的动态编程解决方案。有人能帮我或给我指出正确的方向吗?我会很感激的

from itertools import product

def anycomb(item1, item2, item3, item4):
    return ( comb
             for comb in product(item1, item2, item3, item4)
             )

def totalvalue(comb):
    ' Totalise a particular combination of items'
    totwt = totval = 0
    for item, wt, val in comb:
        totwt  += wt
        totval += val
    return (totval, -totwt) if totwt <= 400 else (0, 0)

itemset_1 = (
    ("map", 9, 150), ("compass", 13, 35), ("water", 153, 200), ("sandwich", 50, 160),
    ("glucose", 15, 60))
itemset_2 = (
    ("tin", 68, 45), ("banana", 27, 60), ("apple", 39, 40),
    ("cheese", 23, 30), ("suntan cream", 11, 70))
itemset_3 = (
    ("beer", 52, 10), ("camera", 32, 30),
    ("t-shirt", 24, 15), ("trousers", 48, 10), ("umbrella", 73, 40),
    ("waterproof trousers", 42, 70))
itemset_4 = (
    ("waterproof overclothes", 43, 75),
    ("note-case", 22, 80), ("sunglasses", 7, 20), ("towel", 18, 12),
    ("socks", 4, 50), ("book", 30, 10))

bagged = max( anycomb(itemset_1, itemset_2, itemset_3, itemset_4), key=totalvalue) # max val or min wt if values equal
print("Bagged the following items\n  " +
      '\n  '.join(sorted(item for item,_,_ in bagged)))
val, wt = totalvalue(bagged)
print("for a total value of %i and a total weight of %i" % (val, -wt))
来自itertools导入产品的

def anycomb(项目1、项目2、项目3、项目4):
返回(梳
用于梳入式产品(项目1、项目2、项目3、项目4)
)
def总值(梳):
“汇总项目的特定组合”
totwt=totval=0
对于梳中的项目、重量、价值:
总重量+=总重量
totval+=val

return(totval,-totwt)如果totwt您只需稍加修改即可使用问题的解决方案。 选择项目时,必须转到上一集的最后一个项目。 这意味着:

F(i,w)=max[F(i-1,w),F(A[i]-1,w-w[i])+p[i]]


其中,[i]表示第i项所属集合的第一项的索引。

您可以在此处执行3D DP,状态为DP(列表中剩余的项目数、列表数、总和)。然后,无论何时选择当前项目,只要减少列表的数量!!它有一个标签Python,我可以给你一些C++代码,什么是约束?