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

 问题描述

0-1背包问题与背包问题(贪心法——背包问题)最大的不同就是背包问题的子问题彼此之间没有联系,所以只要找出解决方法,然后用贪心算法,取得局部最优解就ok了,但是0-1背包问题更复杂,因为物品不可再分,导致了子问题之间是有联系的。

问题分析

      1,刻画背包问题最优解的结构

    

        2,数学描述

   

伪代码解读

 

当上段代码运算完成之后,对于C[i,w]的表:

然后根据上面构造的表,求最优解:

  小结

     动态规划法在判断是否含有第i个物品时,通过判断C[I,w]是否等于C[i-1,w]来得出是否含有第i个物品,感觉挺巧妙的,不过前面构造C[I,w]表的过程感觉工程量好大啊。

时间: 2024-08-30 16:33:10

动态规划法——求解0-1背包问题的相关文章

第十六章 贪心算法——0/1背包问题

 1.问题描述:      给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?      形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,-,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题.        2.最优性原理:      设(y1,y2,-,yn)是 (3.4.1)的一个最优解.则(y

c++-0-1背包问题(动态规划)

问题描述 0-1背包问题(动态规划) 代码敲出来了但是提交是错的,我也不知道为什么了,题目和代码都在下面,帮我看看吧!!! 题目如下: Problem Description 给定n种物品和1个背包,物品i的重量是wi,其价值为vi,背包的容量为C.要求选择装入背包的物品,使得装入背包中物品的总价值最大. Input 每组测试数据包含3行,第1行为n和c,表示有n(0<=n<=400)个物品且背包容量为c (c<=1500),第二行为这n个物品的重量wi(1<=wi<=100

动态规划法:背包问题

一 几个概念: 最优化问题:有n个输入,它的解由这n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束条件的解称为问题的可行解.满足约束条件的可行解可能不止一个,为了衡量这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,这些标准函数称为目标函数,使目标函数取得极值的可行解成为最优解,这类问题称为最优化问题. 二 最优性原理: 对于一个具有n个输入的最优化问题,其求解的过程往往可以划分为若干个阶段,每一个阶段的决策仅依赖前一阶段的状态,由决策

五大常用算法 之 动态规划法

一.基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划.     动态规划是运筹学中用于求解决策过程中的最优化数学方法.当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法.它是应用数学中用于解决某类最优化问题的重要工具.     如果问题是由交叠的子问题所构成,我们就可以用动态规划技术来解决它,一般来说,这样的子问题出现在对给定问题求解

背包问题

P01: 01背包问题 题目:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v] = max{ f[i-1][v], f[i-1][v-c[i]] + w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生

【算法导论】贪心算法之背包问题

        在讨论贪心算法时,我们先了解贪心算法与动态规划之间的区别与联系,后面我们将发现可以用0.1背包问题和部分背包问题来比较贪心算法和动态规划的关系.         我们知道,对于一个最优解问题,贪心算法不一定能够产生一个最优解.因为,如果想要采用贪心算法得到最优解需要满足两个条件:贪心选择性质.最优子结构.         贪心选择性质:一个全局最优解可以通过局部最优解来得到.that is to say,当考虑如何做选择时,我们只考虑对当前问题最佳的选择而不考虑子问题的结果.  

hdu 2955 Robberies(0/1背包)

点击打开链接hdu 2955 思路: 0/1背包 分析: 1 按照题目的意思我们很容易知道这就是一个0/1背包问题,如果我们把概率当作是背包的容量,那么我们遇到一个问题就是浮点数的dp,因为题目没有告诉我们小数点具体几位,那么我们就不能够通过乘上10^n来转化为整数,所以我们应该考虑换种思想 2 按照正常的思路是dp[i][j]表示前i个物品放入概率为j的最大价值,那么我们这边把价值当成背包来看的话我们设dp[i][j]表示前i个物品放入金钱为j的最小被抓概率(因为题目不好求最小概率我们可以认为

c语言-帮忙看个背包问题,输入数据不成功

问题描述 帮忙看个背包问题,输入数据不成功 #include"stdio.h" #include"iostream" #define M 20 typedef struct node{ int weight; int price; int flag; }Node; typedef struct knap { Node a[M]; int total; int size; }*Knap; int f(Knap k) { int index=-1; int mp=0;

PHP回溯法解决0-1背包问题实例分析_php技巧

本文实例讲述了PHP回溯法解决0-1背包问题的方法.分享给大家供大家参考.具体分析如下: 这段代码是根据<软件设计师>教程的伪代码写的: 最麻烦的不是伪代码改成php,而是数组下标从0开始,及相应的下标判断问题: 带着调试输出一块写上 <?php $v_arr = array(11,21,31,33,43,53,55,65); $w_arr = array(1,11,21,23,33,43,45,55); $n = count($w_arr ); //测试输出 var_dump(bkna