Python动态背包问题,怎么解决

Python015

Python动态背包问题,怎么解决,第1张

def bag(n,c,w,v):  

  res=[[-1 for j in range(c+1)] for i in range(n+1)]  

  for j in range(c+1):  

    res[0][j]=0  

  for i in range(1,n+1):  

    for j in range(1,c+1):  

      res[i][j]=res[i-1][j]  

      if j>=w[i-1] and res[i][j]<res[i-1][j-w[i-1]]+v[i-1]:  

        res[i][j]=res[i-1][j-w[i-1]]+v[i-1]  

  print res  

  return res  

  

def show(n,c,w,res):  

  print '最大价值为:',res[n][c]  

  x=[False for i in range(n)]  

  j=c  

  for i in range(n,0,-1):  

    if res[i][j]>res[i-1][j]:  

       x[i-1]=True  

       j-=w[i-1]  

  print('选择的物品为:')  

  for i in range(n):  

    if x[i]:  

      print '第',i,'个,'  

  print('')  

  

if __name__=='__main__':  

  n=5  

  c=10  

  w=[2,2,6,5,4]  

  v=[6,3,5,7,6]  

  res=bag(n,c,w,v)  

  show(n,c,w,res)

输出:[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [-1, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6], [-1, 0, 6, 6, 9, 9, 9, 9, 9, 9, 9], [-1, 0, 6, 6, 9, 9, 9, 9, 11, 11, 14], [-1, 0, 6, 6, 9, 9, 9, 13, 13, 16, 16], [-1, 0, 6, 6, 9, 9, 12, 13, 15, 16, 16]]

最大价值为: 16

选择的物品为:

第 0 个,

第 1 个,

第 3 个,

看到这样贴code的就犯愁。。。看你的code还要自己格式化一遍,太折腾人了。。。

1、格式!

2、knapsack_dynamic 这个函数是哪里跳出来的? 和定义的函数不论名字还是参数个数,都对不上。

3、显示中文,至少要声明文件编码。比如要在脚本第一行声明

# encoding: utf-8

动态规划,可以给你说下思路。

我们用一个二维的矩阵A来存储中间结果,A[i][j]代表前i个物体装入容量为j的背包时可以得到的最优解,相当于是原问题的一个子问题,然后我们就可以写出递推式来更新这个矩阵,具体可以参考下详细的讲解,网上的博客非常多不用我再写一遍。

比如这种:http://zh.wikipedia.org/zh-cn/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98

先自己读一遍吧,有问题可以再问。