01背包问题python 2.7实现

版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 class bag():
 4     def __init__(self,weight,value):
 5         self.weight = weight
 6         self.value = value
 7     def knapsack(self, full_weight):#weight value存数组
 8         result = [[0 for i in range(full_weight+1)] for i in range(len(self.value)+1)]
 9         count = len(self.weight)#物品个数
10         for n in range(1,count+1):#n当前最大物品个数
11             for weight in range(0,full_weight+1):#背包内重量递增
12                 if self.weight[n-1]<=weight:#第n个背包的重量为weight[n-1]判断是否小于允许容量
13                     if result[n-1][weight]<(result[n-1][weight-self.weight[n-1]]+self.value[n-1]):
14                         #如果当前物品在相同重量情况下价值更高
15                         result[n][weight]=result[n-1][weight-self.weight[n-1]]+self.value[n-1]
16                     else:
17                         result[n][weight]=result[n-1][weight]
18                 else:
19                     result[n][weight] =result[n-1][weight]
20         for perrow in result:
21             print perrow
22         return result
23     def find_which(self,full_weight):
24         result = self.knapsack(full_weight)
25         i= len(result)-1
26         j = len(result[i])-1
27         while i >=1:
28             while j>=1:
29                 if result[i-1][j]!=result[i][j]:#说明当前行的东西拿了
30                     print ‘第‘+ str(i)+‘个‘
31                     j = j -self.weight[i-1]
32                     i = i - 1
33                     break
34                 else:
35                     i = i -1
36
37
38 def main():
39     sort_instance = bag([2,2,6,5,4,1,2,7,5,7,4],[6,3,5,4,6,1,4,7,3,6,1])#重量,价值初始化
40     sort_instance.find_which(30)#定义背包总重量
41
42 if __name__ ==‘__main__‘:
43     main()

实现结果:

时间: 2024-07-31 14:33:15

01背包问题python 2.7实现的相关文章

01背包问题python实现

在01背包问题中,在选择是否要把一个物品加到背包中,必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比较,这种方式形成的问题导致了许多重叠子问题,使用动态规划来解决.n=5是物品的数量,c=10是书包能承受的重量,w=[2,2,6,5,4]是每个物品的重量,v=[6,3,5,4,6]是每个物品的价值,先把递归的定义写出来: 然后自底向上实现,代码如下: def bag(n,c,w,v): res=[[-1 for j in range(c+1)] for i in range(n+1)

01背包问题(回溯法)python实现

接上一篇,同样的01背包问题,上一篇采用动态规划的方法,现在用回溯法解决.回溯法采用深度优先策略搜索问题的解,不多说,代码如下: bestV=0 curW=0 curV=0 bestx=None def backtrack(i): global bestV,curW,curV,x,bestx if i>=n: if bestV<curV: bestV=curV bestx=x[:] else: if curW+w[i]<=c: x[i]=True curW+=w[i] curV+=v[i

01背包问题(动态规划)python实现

在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题,使用动态规划来解决.n=5是物品的数量,c=10是书包能承受的重量,w=[2,2,6,5,4]是每一个物品的重量,v=[6,3,5,4,6]是每一个物品的价值,先把递归的定义写出来: 然后自底向上实现,代码例如以下: def bag(n,c,w,v): res=[[-1 for j in range(c+1)] for i in range

动态规划——背包问题python实现(01背包、完全背包、多重背包)

目录 01背包问题 完全背包问题 多重背包问题 参考: 背包九讲--哔哩哔哩 背包九讲 01背包问题 01背包问题 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包流量,且总价值最大. 二维动态规划 f[i][j] 表示只看前i个物品,总体积是j的情况下,总价值最大是多少. result = max(f[n][0~V]) f[i][j]: 不选第i个物品:f[i][j] = f[i-1][j]; 选第i个物品:

动态规划之 0-1背包问题及改进

有N件物品和一个容量为V的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大.在选择装入背包的物品时,对于每种物品i,只能选择装包或不装包,不能装入多次,也不能部分装入,因此成为0-1背包问题. 形式化描述为:给定n个物品,背包容量C >0,重量 第i件物品的重量w[i]>0, 价值v[i] >0 , 1≤i≤n.要求找一n元向量(X1,X2,…,Xn,), Xi∈{0,1}, 使得 ∑(w[i] * Xi) ≤C

01背包问题-只求背包的最终最大价值,不考虑选哪些物品怎么放---最优解(欢迎讨论)

题目来自lintcode http://www.lintcode.com/zh-cn/problem/backpack/ 一个传统01背包问题的推广,假如只考一个背包放物品之后的最终最大价值,不考虑具体选哪些物品放入,该如何实现? 最蠢最笨的办法,那当然就是-老老实实的构造背包容量-物品矩阵,然后取出矩阵最上方最右的值即可: 代码也非常易懂: class Solution: # @param m: An integer m denotes the size of a backpack # @pa

动态规划一:01背包问题

最近碰到很多有关于动态规划的问题,总结一下: 一.01背包问题(python实现) 例:给定3个物品,背包的容量为50磅 物品1重10磅,价值60:物品2重20磅,价值100:物品3重30磅,价值120 求背包能装下的最大价值 求解表如下 物品    0磅       10磅        20磅        30磅        40磅         50磅 0     0价值     0价值       0价值       0价值      0价值        0价值 1      0

【动态规划】01背包问题_两种解法

问题描述 0-1背包问题:给定\(n\)种物品和一背包.物品i的重量是\(w_i\),其价值为\(v_i\),背包的容量为\(C\).问:应该如何选择装入背包的物品,使得装人背包中物品的总价值最大? 在选择装人背包的物品时,对每种物品\(i\)只有两种选择,即装人背包或不装入背包.不能将物品\(i\)装入背包多次,也不能只装入部分的物品\(i\).因此,该问题称为0-1背包问题. 此问题的形式化描述是,给定\(C>0\),\(w_i>0\),\(v_i>0\),\(1≤i≤n\),要求找

动态规划之01背包问题(最易理解的讲解)

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b