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

2     0价值     60价值    100价值    160价值    160价值    160价值

3     0价值     60价值    100价值    160价值    180价值    220价值

由上表可知最大容量的最大价值是220

代码如下:

 1 def weight_goods(n, weight, w, v):
 2     #n是物品数
 3     #weight是背包容量
 4     #w列表是每个物品的体积
 5     #v列表是每个物品的价值
 6
 7     #res1 = [[0 for j in range(weight+1)] for I in range(n+1)]   一步实现
 8     #三种物品选入背包的重量对应的价值res[i]是,物品res[i][j]是选入物品的价值,用0初始化二维数组
 9     res = []
10     for I in range(n+1):
11         for j in range(weight+2):
12             a = [0]*j
13         res.append(a)
14
15     #当分别放入0,1,2,3物品的组合时,输出容量为0-50磅的价值
16     for I in range(1, n+1):
17         for j in range(0, weight+1):
18             res[i][j] = res[i-1][j]
19
20     #以下是状态转移方程:res[i][j] = max{res[i-1][j-w[i-1]]+v[i-1], res[i][j]}
21     if j >= w[i-1] and res[i][j] < res[i-1][j-w[i-1]]+v[i-1]:
22         res[i][j] = res[i-1][j-w[i-1]]+v[i-1]
23
24     #以上得出背包最大容量下的最大价值是res[n][weight],以下通过排列组合得出所有可能组合的价值值
25     #然后在判断容量不超过背包容量的情况下,过滤出与已知最大价值的值相等的组合,此组合就是装入背包的物品
26     import itertools
27     for i in range(len(w)+1):
28         h = list(itertools.combinations(range(1, len(w)+1), i))
29         for j in h:
30             x = []
31             y = []
32             for z in j:
33                 x.append(v[z-1])
34                 y.append(w[z-1])
35             if sum(x) == res[n][weight] and sum(y) <= 50;
36                 for z in j:
37                     print(‘第‘, z, ‘个物品,‘, end=‘‘ )
38       print(‘得到的最大价值=‘, res[n][weight])
39
40 weight_goods(3, 50, [10,20,30], [60,100,120]) 

下一章节:完全背包

原文地址:https://www.cnblogs.com/qfdxxdr/p/9153120.html

时间: 2024-09-28 18:04:16

动态规划一:01背包问题的相关文章

动规基础——01背包问题(背包问题Ⅱ)

题目来源:领扣 | LintCode 有 i 个物品和一个总容量为 j 的背包. 给定数组 weight 表示每个物品的重量和数组 value 表示每个物品的价值,求最大价值.(物品不能分割) 背包问题II 这道题是一道动态规划(dp)算法的基础题,有两种实现方式,分别是递归和递推(迭代),前者比后者好理解. 解题思路 首先,题目的要求是找出最大价值,所以我们要想,怎么存放才能让他的价值最大呢?因为物品具有重量,背包容量也有限,所以我们不能每次都放入最大价值的物品,举个例子,假设背包容量为 10

0-1背包问题(动规基础,好吧虽然我现在在说大话,待续...)

(此位老兄的讲解深得我意,特来推荐:http://blog.csdn.net/insistgogo/article/details/8579597) 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. POINT: 1·每种物品仅有一件,可以选择放或不放. 2·子问题---将前i件物品放入容量为V的背包中.价值总和为f[i][V]; 若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!详解!)

Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". This man like to collect varies of bones , such as dog's , cow's , also he went to the grave - The bone collector had a big bag with a volu

01背包问题:

01背包问题: 1.递归思想 0- 1 背包问题如果采用递归算法来描述则非常清楚明白, 它的算法根本思想是假设用布尔函数knap( s, n) 表示n 件物品放入可容质量为s 的背包中是否有解( 当knap 函数的值为真时 说明问题有解,其值为假时无解) . 我们可以通过输入s 和n 的值, 根据它们的值可分为以下几种情况讨论: ( 1) 当s= 0时可知问题有解, 即函数knap( s, n) 的值为true; ( 2) 当s< 0 时这时不可能, 所以函数值为false; ( 3) 当输入的

动态规划法—0-1背包问题(一)

0-1背包问题 问题描述 给定n个物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为W.应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 约束条件 放入背包的物品的重量<=背包容量W 物品只能进入背包或不进入背包,不可拆分,区别于部分背包问题. 求解目标 我们可以这样来刻画问题的解. 假如有n个物品,用Xi表示第i个物品的状态.Xi 的值为0或1.0表示物品未进入背包,1表示物品进入背包. 那么问题的解就是一个集合(X1,X2,X3,-,Xi,-,Xn) . 所以,我们就是要

0-1背包问题与子集合加总问题的近似算法

最近没有怎么更新博客,因为一直比较忙.最近发现所里在做的一个项目中,可以抽出一部分内容和0-1背包问题.子集合加总问题非常相似(虽然表面上不容易看出相似点),所以看了一些这方面的资料和论文,这里主要对问题特点和算法思想做一些整理.这类问题其实很有意思,做数学和做计算机的人都会研究,而且我这里将要提到的论文都是做计算机的人所写的. 问题简述0-1 Knapsack Problem (0-1背包问题,下面简称KP)和Subset Sum Problem (子集合加总问题,下面简称SSP)是经典的NP

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

01背包问题:POJ3624

背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们的数组基于这样一种假设: totalN表示物品的种类,totalW表示背包的容量 w[i]表示第i件物品的重量,d[i]表示第i件物品的价值. F(i,j)表示前i件物品放入容量为j的背包中,背包内物品的最大价值. F(i,j) = max{ F(i-1,j) , F(i-1,j-w[i])+d[i