Python贪婪的小偷

时间:2014-03-11 22:11:03

标签: python int greedy

为什么它会给我一个错误" ' INT'对象不是可订阅的"当我运行程序?我看着我做错了什么,我知道它必须是第24行的整数,但是当我将容量[1]改为容量(int [1])时,它给了我同样的错误。任何提示都将不胜感激。

class Bag():
    __slots__=('name', 'weight', 'value')

def mkBag(name, weight, value):
    thisBag = Bag()
    thisBag.name = name
    thisBag.weight = weight
    thisBag.value = value
    return thisBag

def ratio(treasure):
     print(treasure)
     print(treasure)
     return treasure[2]//treasure[1]

def plunder(treasure, capacity):
    treasure = sorted(treasure, key=ratio, reverse=True)
    bagLst = []
    current = 0
    while current < capacity:
        if capacity != 0:
            if capacity > current[1]:
                bagLst.append(mkBag(treasure[0],weight[1],current[2]))
                capacity = capacity - current[1]
            else:
                bagLst.append(mkBag(current[0], capacity, (current[2]/current[1]), capacity))
                capacity = 0
    return bagLst


def main():
    capacity = 10
    name = ''
    weight = 0
    value = 0
    treasure = [('silver', 20, 100), ('platinum', 10, 400), ('paladium',10,800), ('diamonds',5,900), ('gold', 10,60)]
    bagLst = plunder(treasure, capacity)

    for line in bagLst:
        print('bagLst')

2 个答案:

答案 0 :(得分:2)

current是一个int:

current = 0

但您尝试将其用作列表:

if capacity > current[1]:
    bagLst.append(mkBag(treasure[0],weight[1],current[2]))
    capacity = capacity - current[1]
else:
    bagLst.append(mkBag(current[0], capacity, (current[2]/current[1]), capacity))

您使用current[index]的任何地方都试图索引整数值。

如果您希望current成为序列,则需要将其设置为1。

怀疑你要检查当前的宝贝是否要加到包里;但是你没有挑选任何宝物。有点像:

current = 0

while capacity and current < len(treasure):
    item = treasure[current]
    current += 1
    if capacity > item[1]:
        bagLst.append(mkBag(item[0], item[1], item[2]))
        capacity = capacity - item[1]
    else:
        bagLst.append(mkBag(item[0], capacity, (item[2]/item[1]), capacity))
        capacity = 0

答案 1 :(得分:0)

"int" object not subscriptable表示您正在尝试1234[1]。这没有任何意义!你可以下标一个字符串('abcdefg'[1] == 'b')和一个列表([1,2,3,4,5][1] == 2),但你不能得到第34个元素&#34;整数。

在你的行中:

# in def plunder(...):
if capacity > current[1]:

您正在尝试访问current的第二个元素,该元素当前等于整数0。你想把它列入清单吗?您期望在current[1]中做什么?

这是实现这个目标的更好方法

嘿那里,所以我认为你的意思是current[1]实际上是item[1],意思是你正在看的项目的重量。相反,current旨在成为行李的重量。明白!也就是说,我为此写了一个更好的解决方案:看看吧!

class Treasure(object):
    def __init__(self,name,weight=0,value=0,id_=0):
        self.name = name
        self.weight = weight
        self.value = value
        self.id = id_ # bootstrap for further development
    @property
    def ratio(self):
        return self.value/self.weight

class BagFullError(ValueError):
    pass

class Bag(object):
    def __init__(self,owner=None,capacity=10):
        self.owner = owner
        self.capacity = capacity
        self.contents = list()
    def __str__(self):
        return_value = "CONTENTS:"
        for item in self.contents:
            return_value += "\n  ${0.value:4}  {0.name:10}{0.weight} lb".format(item)
        return return_value
    def add(self,other):
        if not isinstance(other,Treasure):
            raise TypeError("Must pick up Treasure")
        if self.weight + other.weight > self.capacity:
            raise BagFullError("Bag cannot fit {}({} lb) ({} lb/{} lb)".format(
                other.name,other.weight,self.weight,self.capacity))
        self.contents.append(other)
    def remove(self,other):
        self.contents.remove(other)
        # may throw ValueError if `other` not in `self.contents`
    @property
    def weight(self):
        return sum(item.weight for item in self.contents)

treasure = [Treasure('silver', 20, 100), Treasure('platinum', 10, 400),
            Treasure('paladium',10,800), Treasure('diamonds',5,900),
            Treasure('gold', 10,60)]
## map(lambda x: Treasure(*x), [('silver',20,100), ... ])

def plunder(treasure_list,bag=None):
    _bag = bag or Bag()
    treasures = sorted(treasure_list,
                       key = lambda x: x.ratio,
                       reverse = True)
    while True:
        for treasure in treasures:
            try: _bag.add(treasure)
            except BagFullError as e:
                print(e)
                return _bag

bag = Bag("Adam",100)
print(bag)
plunder(treasure,bag)
print(bag)
print("Total Value: {}".format(sum(item.value for item in bag.contents)))