#! /usr/bin/env python
#coding=utf-8
class BackSack():#定義揹包類
def __init__(self,capacity):#類的初始化
self.capacity=capacity #揹包最大容量(重量)
self.currentWeight=0 #揹包當前重量
self.bestValue=0 #揹包可容納貨物的最大價值,最優值
self.currentValue=0 #揹包內當前已裝貨物的價值
def Backtrack(self,i):#遍歷解空間尋找最優值,I:當前搜索的深度
global length,weight,value,goods #全局變量
if(i>length):
if self.currentValue>self.bestValue: #更新最優值
self.bestValue=self.currentValue
self.currentCapacity=self.currentWeight#當前最優解下的揹包重量
self.bestgoods=goods[0:5]
print ('best:',self.bestgood)#輸出當前的最優解,最後一次輸出即是最終的最優解
return
if self.currentWeight+weight[i]<=self.capacity:#進入左子樹,即選取goods[i]放入揹包
goods[i]=1
self.currentWeight=self.currentWeight+weight[i]
self.currentValue=self.currentValue+value[i]
self.Backtrack(i+1)
self.currentValue=self.currentValue-value[i]#進入右子樹,即捨棄goods[i],不放入揹包
self.currentWeight=self.currentWeight-weight[i]
goods[i]=0
self.Backtrack(i+1)
def main():
global length,weight,value,goods #全局變量,分別表示貨物數目,貨物的重量數組,價值數組,貨物的選取即0-1值
currentWeight=0
bestValue=0
currentValue=0
capacity=10
weight=[2,2,6,5,4]
value=[6,3,5,4,6]
goods=[0,0,0,0,0]
length=len(weight)-1
backsack=BackSack(10)
backsack.Backtrack(0)
#backsack.Backtrack=Backtrack
print backsack.bestValue,backsack.currentCapacity#輸出最優值和揹包內物品的總重量
print backsack.bestgoods #輸出最優解
main()