贪心算法在背包问题上的应用
Posted 毛克叔叔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法在背包问题上的应用相关的知识,希望对你有一定的参考价值。
谈到贪心算法,我感觉这是这几种算法中最简单的一个算法,但是简单并不代表用途不大,贪心算法一旦被证明是正确有效的算法,它的算法执行效率却是很高的,当然时间复杂度也是相当的低的,所以我们不能因为简单就忽略了贪心算法的巨大作用。
那么贪心到底是什么意思呢?我举一个生活中的简单例子来讲一下什么是贪心算法。相信每个人都去过超市买东西吧,当我们购物完毕,进行结账时,你有没有发现收银员给你找零钱时她总是从大往小进行找钱。假如要找给你78元,她首先找给你一张50的,然后一张20的,最后就是一张5块的和三张一块的。像找零钱这样的:只考虑当前的状态,不考虑之后的情况,这就是贪心算法的第一大特点:贪心选择性质(所求问题的整体最优解可以通过一系列的局部最优解进行解决)。这也是它与动态规划算法的最大区别。当然它也满足最优子结构性质,找50元的时候是当前选择的最优解,除去50,20元也是剩余部分问题的最优解。所以贪心算法在日常生活中是比较常见的,只是我们没有发觉而已。
背包问题描述:此问题与0-1问题极其相似,不同点就在于这次选择的物品是现金等可以拿部分的物品。核心思想就是在不超过背包总容量的前提下尽可能多的优先选取单位价值高的物品放入背包中,直至背包装满或者物品拿完。
因为贪心算法比较简单,下面附简单的算法过程:
void Knapsack (int n,float M,float v[],float w[],float x[])
{
Sort(n,v,w);
int i;
for(i = 1;i <= n;++i) x[i] = 0;
float c = M;
for(i = 1;i <= n;++i)
{
if(w[i] > c) break;
x[i] = 1;
c -= w[i];
}
if(i <= n) x[i] = c/w[i];
}
以上是关于贪心算法在背包问题上的应用的主要内容,如果未能解决你的问题,请参考以下文章