首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅析C语言贪心算法

前言 贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。...贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。...贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。...贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。...三、贪心算法案例 3.1背包问题: 先给大家介绍一下这个问题,就是给你一个背包背包容量有限,但现在你要用这个背包去装一些物品,但这些物品价值不同,有的价值高,有的价值低,但我们想要尽可能的提升这个】背包的价值

10110

贪心算法背包问题

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。...贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。...完全背包问题:给定n个物品和一个容量为C背包,物品i的重量是Wi,其价值为Vi,背包问题是如何选择入背包的物品,使得装入背包的物品的总价值最大,与0-1背包的区别是,在完全背包问题中,可以将物品的一部分装入背包...设计算法的思路很简单,计算物品的单位价值,然后尽可能多的将单位重量价值高的物品放入背包中。...python实现代码如下: 1 # coding=gbk 2 # 完全背包问题,贪心算法 3 import time 4 __author__ = 'ice' 5 6 7 class

1.1K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【趣学算法】Day3 贪心算法——背包问题

    (3)使用贪心算法求解问题 算法分析 ---- 题目描述         有n种物品,每种物品只有一个,第i种物品的重量为 wi,价值为 vi,背包的容量为 w,物品可以分割。...因此,我们应采用第三种贪心策略——每次从剩下的物品中选单位重量价值最大的物品。 算法设计  (1)确定合适的数据结构并初始化。...(2)根据贪心策略,按照单位重量价值从大到小选取物品,直到达到背包容量。如果在装入第 i 个物品时超出背包容量,则取该物品的一部分装入背包。 完美图解         物品的价值和重量如表2-3所示。...return a.p > b.p; // 指定按照物品的单位重量价值进行降序排列 } sort(s, s + n, cmp); //前两个参数分别为待排序数组的首地址和尾地址,cmp为比较函数 (3)使用贪心算法求解问题...for(int i = 0; i < n; i++) { //是用贪心算法求解问题 if(s[i].w < cleft) { //如果物品的重量小于或等于剩余容量

    1.1K30

    Python ---- 算法入门(1)贪心算法解决部分背包问题

    一个小偷想到商店行窃,他的背包最多只能装 50 斤的商品,如何选择才能获得最大的收益呢? 2. 解决问题的思路【贪心算法贪心算法是每一步都追求最优的解决方案; 如何选择是最优的商品?...【计算每个商品的收益率(收益/重量)】 使用贪心算法进行选择!【优先选择收益率最大的商品】 解决最终问题装够50斤!...【直至所选商品的总重量达到 50 斤】 注意:虽然贪心算法每一步都是最优的解决方案,但整个算法并不一定是最优的。 3....初始化背包大小和商品列表 # 背包可装总重量 w =50 # 所有商品信息列表 goods_info = [ {'name': 'goods1','weight': 20, 'profit':...贪心算法解决部分背包问题的完整代码 ''' Descripttion: version: 1.0.0 Author: Rattenking Date: 2022-07-12 14:13:34 LastEditors

    48620

    贪心算法(二)——一般背包问题

    注:背包问题分为两种,若每个物体不可分割,则称为0/1背包问题,这种问题无法用贪心法求的最优解,只能求的近似解。而若每个物体可以切分,则称为一般背包问题,可以使用贪心法求的最优解。...下面讨论的就是一般背包问题。 结果集 一般背包问题中,结果集可以用一个n元组表示: 1. x的下标i表示物体的序号; 2. xi表示第i个物体加入背包的部分(0<=xi<=1) ?...目标函数 使用贪心法解决最优化问题的第一步,就是要从题目中抽象出目标函数,这是一个数学建模的过程。 本题中,目标函数就是当前背包收益的最大值: ?...约束条件 所选的物体放入背包后,不能超过背包载重M: ? 最优量度准则1:重量小的物体优先 将所有物体按照重量递增的顺序排序,每次选重量最小的放入背包。...lastBody = bodys.get(i); results.add(new Body(lastBody.id,rest,(lastBody.p*rest/lastBody.w)); } 总结 要用贪心法解决一个最优化问题

    2.1K70

    漫画:什么是“贪心算法”?如何求解“部分背包问题”?

    我们回到刚才的题目当中,假设背包的容量是10,有5个商品可供选择,每个商品的价值和重量如图所示: 让我们来计算一下每件物品的性价比,其结果如下: 毫无疑问,此时性价比最高的是物品4,我们把物品...4放入背包当中,背包剩余的容量是8: 我们选择物品1放入背包背包剩余的容量是4: 于是,我们选择0.8份的物品5放入背包背包剩余的容量为0: public static...仍然给定一个容量是10的背包,有如下三个物品可供选择: 这一次我们有个条件限制:只允许选择整个物品,不能选择物品的一部分。...如果按照贪心算法的思路,首先选择的是性价比最高的物品1,那么背包剩余容量是4,再也装不下其他物品,而此时的总价值是6: 但这样的选择,真的能让总价值最大化吗?...如果我们不选择物品1,选择物品2和物品3的话,剩余容量是0,总价值是7: 显然,7>6,依靠贪心算法得出的结果,未必是全局最优解。 漫画:什么是动态规划?(整合版)

    59130

    贪心算法及几个经典例子c语言_贪心算法一定是最优解吗

    贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。...六、例题分析 下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。 [背包问题]有一个背包背包容量是M=150。有7个物品,物品可以分割成任意大小。...约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150) (1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?...实现该算法的过程: 从问题的某一初始状态出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解; 二、例题分析 [背包问题]有一个背包...分析: 目标函数: ∑pi最大 约束条件是装入的物品总重量不超过背包容量,即∑wi<=M( M=150) (1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

    1K21

    C++】算法集锦(14):贪心算法

    文章目录 贪心算法 跳跃游戏 I 思路分析 代码实现 跳跃游戏 II 思路 贪心算法 贪心算法可以理解为一种特殊的动态规划为题,拥有一些更加特殊的性质,可以进一步降低动态规划算法的时间复杂度。...但是呢,我们今天讲的是贪心算法,它可以想象成从上往下一条路走下去。让我们看看: ---- 思路 贪心算法是什么?贪心算法会选择当下最有潜力的一步。...动归的话会递归去算这两步到最终结果的最优步数,但是贪心算法不这样。 贪心算法是每次尽可能多跳吗?...NoNoNo,选择当下最有潜力的:在坐标1的位置,你有三个选择;在坐标2的位置,你只有一个选择,所以贪心算法会让你选择跳到坐标1。...这就是贪心算法的局部最优(不要奇思妙想啥反例,要用贪心算法,就要承担它的失误率)。

    34810

    c语言背包问题(动态规划解法)

    题目描述: 有若干个物品要装进背包,并且每个物品有各自的价值,物品的数量、价值以及背包的容量由用户输入,求背包内能够存入的最大价值为多少,并且求出此时放入了哪些物品 输入格式: 第一行输入物品的容量...r和物品个数n 第二行输入每个物品的重量 第三行输入每个物品的价值 输出格式: 第一行输出背包中能够存储的最大价值 第二行输出此时背包中的物品编号 思路分析: 可以把这个问题看成是一个二维数组...,行是物品编号,列是背包容量,若物品编号为2,背包容量为4,代表的则是当背包容量为4的时候,前两个物品的最大价值。...因此当行为物品数,列为背包容量时,即容量为n的背包能够存储的最大价值。 因此我们定义一个函数给全局变量二维数组赋值,返回二维数组右下角的值即可。...那么怎么判断放入了哪些物品呢,此时可以根据算法来逆推,若当前物品在当前容量时的价值,与前一个物品在相同容量时的价值相等,则证明当前物品没有被放进背包

    73520

    动态规划之背包问题(C语言

    背包问题还存在需要恰好装满背包和不需要恰好装满两种情况 这篇文章所探讨的所有背包问题都是建立在不需要恰好装满的情况下 由简单背包问题的基础上又衍生出许多问题都可以采用动态规划解决。...1][j-weight[i]]+value[i]); } else f[i][j]=f[i-1][j]; } 该算法的时间复杂度一定降到最低...完全背包问题不设定物品取用上限 对于算法的优化我们可以这样想: 在01背包问题中,我们要保证第i次循环中的f[i][v]是由f[i-1][V-weight[i]]递推而来,每一次都是“加选出一个(即一种...(x):(y) int main() { //f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v},其中0<=k<=V/weight[i+...(x):(y) int main() { //f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v},其中0<=k<=V/weight[i+

    83510

    C语言】——背包问题详解「建议收藏」

    1.题目描述:——背包问题 有若干物品,每种物品的价值和重量各不相同,将物品装入一个容量有限的背包,如何选择装入的物品,使背包的价值最大。...2.题目分析: 要是背包中的物品价值最大,则需要在有限的重量中尽可能装入价值更大的物品,基于这种思想则采取贪心算法 首先计算物品的单位价值,即价值/重量,根据单位价值对物品进行排序,优先装入单位价值高的物品...,直至背包装满。...3.代码实现: #include int n;//物品数量 double c;//背包容量 double v[999];//物品的价值 double w[999];//物品的重量 double...cw = 0.0;//背包重量 double cp = 0.0;//背包价值 double bestp = 0.0;//当前最优价值 double perp[999];//物品性价比排序 int order

    35330

    C++经典算法题-背包问题

    13.Algorithm Gossip: 背包问题(Knapsack Problem) 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物 品,假设是水果好了,水果的编号...以背包问题为例,我们使用两个阵列value与item,value表示目前的最佳解所得之总价,item表示最后一个放至背包的水果,假设有负重量 1~8的背包8个,并对每个背包求其最佳解。...逐步将水果放入背包中,并求该阶段的最佳解: 由最后一个表格,可以得知在背包负重8公斤时,最多可以装入9050元的水果,而最后一个装入的 水果是3号,也就是草莓,装入了草莓,背包只能再放入...7公斤(8-1)的水果,所以必须看背包负重7公斤时的最佳解,最后一个放入的是2号,也就 是橘子,现在背包剩下负重量5公斤(7-2),所以看负重5公斤的最佳解,最后放入的是1号,也就是苹果,此时背包负重量剩下...C代码 #include #include #define LIMIT 8 // 重量限制#define N 5 // 物品种类#define MIN 1 /

    45230

    C++】算法集锦(9):背包问题

    文章目录 0-1背包问题 动态规划标准套路 伪代码 修缮代码 子集背包问题 思路分析 代码实现 完全背包问题 本来要拿《背包九讲》作为参考的,奈何太抽象,我看不懂 0-1背包问题 给你一个载重量为...W 的背包,以及一堆物品,这些物品都有属于自己的两个属性:价值var和质量wt,试问这个背包最多能装多少价值的物品。...---- 动态规划标准套路 1、明确状态和选择 什么是状态,就是背包的容量,以及可以选择的物体。 什么是选择,这个物品,要不要放进背包。...给你一个只包含正整数的数组,设计一个算法,将这个数组分为两个元素和相等的子集,如果能分,返回true,如果不能分,返回false。...dp数组的含义嘛,dp[i][j] = x 表示,对于前 i 个物品,当前背包容量为 j 的时候,正好能将背包装满,则x为true,否则为false、 做一下状态压缩,把[i]去掉,反正i也是用来循环的

    64410
    领券