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)]
	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]
	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(1,n+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,‘个,‘,end=‘‘)
	print(‘‘)

if __name__==‘__main__‘:
	n=5
	c=10
	w=[2,2,6,5,4]
	v=[6,3,5,4,6]
	res=bag(n,c,w,v)
	show(n,c,w,res)
	

输出结果例如以下:

转载请注明:转自http://blog.csdn.net/littlethunder/article/details/26575417

时间: 2024-10-11 09:43:14

01背包问题(动态规划)python实现的相关文章

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

01背包问题--动态规划解法

从01背包问题理解动态规划 01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6.将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法.本文仅涉及动态规划. 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了. 其次

01背包问题-动态规划算法

转 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 一.问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 二.总体思路:根据动态规划解题步骤(问题抽象化.建立模型.寻找约束条件.判断是否满足最优性原理.找大问题与小问题的递推关系式.填表.寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现: 三.动态规划的原理及过程: eg:number=4,ca

0-1背包问题——动态规划

1 // 动态规划法解决0-1背包问题 2 //example: 3 //物品种类n=5,背包容量c=10, 4 //物品的重量向量 w={2,2,6,5,4},物品的价值向量 v={6,3,5,4,6} 5 // O(min{n*c,2^n}) 6 #include "stdafx.h" 7 #include <cstdlib> 8 #include <iostream> 9 10 using namespace std; 11 template<cla

01背包问题--动态规划解法(2)(转载)

本章主要讲述最简单的背包问题,从如何建立状态方程到如何根据状态方程来实现代码,再到如何优化数据结构,让我们对动态规划的建立与求解认识更加透彻 题目: 有N件物品和一个容量为V的背包.放入第i件物品的费用是Ci,得到的价值是Wi.求解将哪些物品装入背包可使价值和最大. 分析: (一)建立状态方程 这是最基础的背包问题,直接说状态转移方程了,设dp[i][v]表示前i件物品放入容量为v的背包能获得的最大价值,每件物品可以选择放与不放,则有: dp[i][v]=max{dp[i-1][v],dp[i-

动态规划一: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

ACM1881 01背包问题应用

01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 struct BG 6 { 7 int h,t,l; 8 friend bool operator<

0-1背包问题与分数背包问题

0-1背包问题与分数背包问题 问题描述 问题分析之分数背包 代码设计之分数背包问题 问题分析之0-1背包问题 代码设计之0-1背包问题 动态规划算法之间的差别 0-1背包问题与分数背包问题 我们在文章<贪心算法原理>:http://blog.csdn.net/ii1245712564/article/details/45369491中提到过动态规划和贪心算法的区别.以及两个经典的例子:0-1背包问题和分数背包问题,我么知道0-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