动态规划三:0-1背包问题

  1.问题描述:

  一定的物体和一背包,物体i的重量为wi价值为vi,背包的容量为c,求解怎样放使背包的价值最大?则问题可描述为:

  

  

  2.问题分析:

  1)最优子结构:

  

  其中j=c-wiyi

  2)递归关系:设最优值为m(i,j),j表示最优容量,i表示可选物品,由最优子结构性质可建立递归式:

  

  

  3.算法描述:(未优化)

 1 #include<iostream>
 2 using namespace std;
 3 int c[10][100];
 4 int Knap(int m, int n){
 5     int w[10];
 6     int v[10];
 7     cout << "输入物体重量w和价值v:\n";
 8     for (int i = 1; i <= n; i++){
 9         cin >> w[i] >> v[i];
10     }
11     for (int i = 1; i <= n; i++)
12     {
13         for (int j = 1; j <= m; j++)//背包的容量则逐一测试
14         {
15             if (w[i] <= j)
16             {
17                 if (c[i - 1][j] < v[i] + c[i - 1][j - w[i]])
18                     c[i][j] = v[i] + c[i - 1][j - w[i]];
19                 else
20                     c[i][j] = c[i - 1][j];
21             }
22             else
23                 c[i][j] = c[i - 1][j];
24         }
25     }
26     return c[n][m];
27 }
28
29 int main(){
30     int n, m;
31     cout << "输入物体数n和背包容量m:\n";
32     cin >> n >> m;
33     cout << Knap(n, m)<<endl;
34     for (int i = 0; i <= n; i++)
35     {
36         for (int j = 0; j <= m; j++)
37             cout<<c[i][j];
38         cout<<endl;
39     }
40     return 0;
41 }

  

时间: 2024-10-11 16:46:45

动态规划三:0-1背包问题的相关文章

基础算法(七)——动态规划【0/1背包问题】

首先,对于动态规划,我来做一个简短的介绍,相信各位都看得懂.动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.先给一道最简单的例题(小学奥数水平): 这就是一个模拟的动态规划法! 好了,现在开始认识一下最简单的动态规划实例:0/1背包. [问题描述]有一位旅行者要出远门,到商店里去筹备东西.在商店里,摆放了n样物品,每种物品有各自的体积,但是每种物品只有一件.这个旅行家有一个限制装V个体积的物品的背包,但是这

hdu2602Bone Collector ——动态规划(0/1背包问题)

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 volume of

动态规划--0,1背包问题(再也不怕类似背包问题了)

这种类型问题三大要素:总重量.每件物品重量.每件物品价值,问最终能够塞进背包中的价值最大是多少?应该怎么选择物品? 当然也不一定是这些,例如上节所说的矿工挖矿:总人数.挖每座矿的人数.每座矿的金子数. 也就是说,只要出现了这三大要素,都可以视为0,1背包问题(物品不可拆分) 动态规划三要素:边界.最优子结构.状态转移方程. 我们一步步进行解析: 初始化:物品总重量:c=8,物品类别:n=['a','b','c','d'],物品重量:w=[2,4,5,3],物品价值:v=[5,4,6,2] 假设我

动态规划算法实现部分——0/1背包问题

代码: import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.pri

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

35岁前成功的12条黄金法则 三0七法则

“三0七法则”37岁法则,人到了37岁就应该明白下面的道理12条黄金法则:“一个目标,两个基点,三项技能,四项原则,五分运气,六项要求,七分学习,八分交际,九分习惯,十分自信,十一个应该避免的人生陷阱,十二分努力”. 年龄对于生活中的每个人是不可轻易说破的秘密,但在职场,年龄却绝对透明.对于行走职场的人来说,年龄很多时候会促成升职的瓶颈.试想,一个女人如果芳龄35,而仍然是一个平板小职员,那一定是职场新生代恐龙了.所以,聪明的人应该懂得并务必赶在35岁前成功,才能从此一劳永逸,一览终山小. 一个

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所

0/1背包问题的动态规划法求解 —— Java 实现

0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握. 值得提及的一个问题是,在用 JAVA 实现时, 是按算法模型建模,还是用对象模型建模呢? 如果用算法模型,那么 背包的值.重量就直接存入二个数组里:如果用对象模型,则要对背包以及背包问题进行对象建模.思来想去,还是采用了对象模型,尽管心里感觉算法模型似乎更好一些.有时确实就是这样,对象模型虽然现在很主流,但也不是万能的,采用