【发布时间】:2018-01-29 00:34:04
【问题描述】:
我正在使用组合来显示背包中所有可能的物品总子集,所以如果我有 10 件物品,价值和重量各不相同,它会显示物品的所有组合,总重量在元组 (Id,Weight,Val) 和总值中的第二个位置,我的问题是我的元组索引超出范围错误。
#Knapsack
from random import *
from itertools import *
#Creates List of Items, using N for Num of Items
#Weightmax for the max range of weights
#Valmax of max value range
#Each Item has a Id, Weight and Value.
#Represented as a tuple. [(Id,Weight,Value)]
def item_list(n,weightmax,valmax):
items = []
for i in range(1,n+1):
items.append((i,randrange(1,weightmax),randrange(1,valmax)))
return items
#----------------------------------------------------
#Is the Sack, Takes Items as a parameter, and Capacity
#Purpose is to find and print all possible combinations that
#Will fit in the sack,then print which subset has the best
#weight for value mix.
def knapsack(items,capacity):
sack = items
subs = []
print("------------------------------")
print("Subset,"," | ", "Total Weight", " | ", "Total Value")
for i in range(len(sack)+1):
print(i)
for j in combinations(items, i):
subs.append(j)
print(j," | ",j[i][1]," | ",j[i][2])
#------------------------------------
#Main, Asks for UserInput and allows you
#to re-enter mistypes.
def main():
choices = False
print("Welcome to the Knapsack Filler!")
print("Please Input the Following Parameters; ")
while choices is False:
knapcap = int(input("Enter Knapsack Max Capacity: "))
maxweight = int(input("Enter Max Range for Weights: "))
maxval = int(input("Enter Max Value Range for Weights: "))
numitems = int(input("Number of Items you wish to generate: "))
prompt= input("\n Y or N; Are you Sure about your Choices?: ")
if prompt.lower() =="yes" or "y":
choices = True
else:
pass
knapsack(item_list(numitems,maxweight,maxval),knapcap)
main()
错误:
Traceback (most recent call last):
File "C:\CS230\CS320_P2_Knapsack.py", line 54, in <module>
main()
File "C:\CS230\CS320_P2_Knapsack.py", line 53, in main
knapsack(item_list(numitems,maxweight,maxval),knapcap)
File "C:\CS230\CS320_P2_Knapsack.py", line 31, in knapsack
print(j," | ",j[i][1]," | ",j[i][2])
IndexError: tuple index out of range
示例输入:
Welcome to the Knapsack Filler!
Please Input the Following Parameters;
Enter Knapsack Max Capacity: **30**
Enter Max Range for Weights: **10**
Enter Max Value Range for Weights: **10**
Number of Items you wish to generate: **3**
Y or N; Are you Sure about your Choices?: Y
------------------------------
Subset, | Total Weight | Total Value
0
【问题讨论】:
-
添加完整的错误!
-
prompt.lower() =="yes" or "y"应该是prompt.lower() =="yes" or prompt.lower()== "y" -
请提供一组输入示例,这些输入会生成您遇到的问题。
-
在下面发布了我的输入示例和错误,很抱歉让组合单独工作很痛苦,现在我不确定为什么我不能索引元组我的输出。
-
@RobertFarmer:我已经重新格式化了您的问题,因此代码、错误和输入不会一起运行在一个大而可怕的块中。请注意我是如何做到这一点的,并在未来模仿它。
标签: python algorithm combinations mathematical-optimization knapsack-problem