背包问题: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的一部分,而不一定要全部装入背包。

1)计算yi=vi/si,即该项价值和体积的比

2)按比值的降序来排序

3)从第一项开始装背包,然后是第二项,依次类推,尽可能的多放,直到装满背包。

(贪心算法只适用于普通背包问题,物品可以任意分割,可以得到最优解。如果不能任意分割,贪心法得到的不一定是最优解,而是一个可行解。

第三种:有界背包问题

最大化 ,受限于 

1)若i=0或j=0,  V[i,j] = 0

2)若j<si, V[i,j] = V[i-1,j]

3)若i>0且j>=k*si,k={1,2,...,bj}, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi,V[i-1,j-2*si]+2*vi,...,V[i-1,j-k*si]+k*vi}

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题),布布扣,bubuko.com

时间: 2024-12-15 03:59:40

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

贪心算法练习题:部分背包问题

/*----------------------------------------------------- 有n个物体,第i个物体的重量是wi,价值为vi, 选若干个物体,使得在总重量不超过c的情况下让总价值尽量高. 这里每个物体都可以只取走一部分,价值和重量按比例计算. 输入: 第一行输入两个整数表示n和c. 第2到第n+1行每行两个整数分别表示wi和vi. 输出: 第一行输出所选物品的总价值v和总重量w以及所选物品的种类数num.两两之间用空格分隔. 第二行到第n+1行按照输入物品的顺序

背包问题(贪心算法)

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题.贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细节想不通.这个问题以后有机会再讲.本次讲一讲背包问题. 背包问题就是有若干物品,每个物品有自己的价值和重量.背包有总重

算法之贪心算法

所谓贪心就是指永远找最大的,在求解问题时,总是做出最好的选择,它得到的是局部的最优解,并不是对所有问题都能得到整体最优解. 其有两个重要的子特性: 1.最优子结构:假如将子结构的一部分去掉,剩下的子结构还是最优子结构. 2.贪心选择性:找单位价值最大的那个. 重点:将给出的一系列问题求解其单位价值(单位路程等),按照其单位价值从大到小(路程从小到大)依次排序.在用贪心算法只需要依次取即可.对于不足的部分可以将其分割,求部分价值. 举例:就像是背包问题,求重量不超过背包重量100时的最大价值.(w

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部最好选择.从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质. 1.贪心选择性质 贪心选择性质是 指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.与动态规划算法的不同之处是贪心算法只依赖在当前状态下做出最优选择,然后再去解做出这个选择后产生的相应的子问题.贪心算法依赖于以往做出的选择,但是绝不依赖未来做出的选择.所以贪心算法是自顶向下解决问题

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

贪心算法练习:寻找最小数

输入一个高精度正整数n,去掉其中任意s个数字以后,剩下的数字按原来的左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案使得所剩下的数字组成的新数最小. 输出应该包括所去掉的数字的位置和组成的新的正整数.其中,n不超过240位. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int fun(char *a,int len,int s);//对数组a表示的高精度整数删除s位.a的长

hdu 1052(田忌赛马 贪心算法,sort排序)

Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18155    Accepted Submission(s): 5281 Problem Description Here is a famous story in Chinese history. "That was about

贪心算法-活动安排问题

活动安排问题 问题描述 有n个需要使用同一资源的活动,且在同一时段只有一个活动能使用该资源. 每个活动i都有一个起始时间 si 和结束时间 fi ,且 si < ei .如果选择了活动 i,则它在半开时间区间 [si,ei) 内占用资源.若区间 [si, ei) 与区间 [sj,ej) 不相交,则称活动 i 与活动 j 是相容的. 该问题就是要安排这些活动使得尽量多的活动能不冲突地举行. 归纳: 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合. 解题思路 每次总是选择具有最早完成时

贪心算法之背包问题

贪婪算法的基本思想:通过一系列步骤来构造问题的解,每一步都是对已构造的部分解的一个扩展,直到获得问题的完整解. 贪婪算法中,每一步“贪婪地” 选择最好的部分解,但不顾及这样选择对整体的影响(局部最优),因此得到的全局解不一定最好的解,但对许多问题它能产生整体最优解. 具体算法描述: public static void Greedy()        {            float cu = c;            int temp = 0;            int i = 0;