0-1背包问题与分数背包问题
0⑴背包问题与分数背包问题我们在文章《贪心算法原理》:http://blog.csdn.net/ii1245712564/article/details/45369491中提到过动态计划和贪心算法的区分。和两个经典的例子:0⑴背包问题和分数背包问题,我么知道0⑴背包问题是不能够使用贪心算法求解的,而贪心算法则是分数背包问题的不2之选。 问题描写
这里我们采取例子:
问题分析之分数背包为简单期间,我们首先来分析1下分数背包问题。如果要设计1个贪心算法,那末首先要肯定1个贪心策略,换句话说就是要怎样在当前的情况下做出1个公道的贪心选择。 下面我们来证明1下上面贪心选择的料想:
因而我们得到最优子结构 代码设计之分数背包问题依照我们上面描写的分数背包问题的最好贪心策略,每次都选出平均价值最高的物品 /*************************************************
* @Filename: fractionPackage.cc
* @Author: qeesung
* @Email: qeesung@qq.com
* @DateTime: 2015-04⑶0 14:44:28
* @Version: 1.0
* @Description: 贪心策略,分数背包问题
**************************************************/
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
#define PACKAGE_CAPACITY 50
/**
* 求得goodslist对应的最大价值,我们首先假定物品依照平均价值降序排序
* @param goodsList 商品列表
* @return 最大价值
*/
unsigned fractionPackage(std::vector<pair<unsigned,unsigned> > goodsList)
{
unsigned valueSum=0;
unsigned capacitySum=0;
for (int i = 0; i < goodsList.size(); ++i)
{
// 转完这次就退出
if(goodsList[i].second + capacitySum >= PACKAGE_CAPACITY)
{
valueSum+=(PACKAGE_CAPACITY - capacitySum)*(goodsList[i].first/goodsList[i].second);
return valueSum;
}
valueSum+=goodsList[i].first;
capacitySum+=goodsList[i].second;
}
return valueSum;
}
int main(int argc,char const *argv[])
{
std::vector<pair<unsigned,unsigned> > goodsList;
goodsList.push_back(pair<unsigned,unsigned>(60,10));
goodsList.push_back(pair<unsigned,unsigned>(100,20));
goodsList.push_back(pair<unsigned,unsigned>(120,30));
cout<<"max value is : "<<fractionPackage(goodsList)<<endl;
while(1);
return 0;
} 运行结果为:
我们这里首先选择平均价值最高的a1放入背包,然后放入a2,由于此时a3不能全部放入背包,因而我们放入a3的1部份进入到背包。这里也很好理解,那就是我们在物品总能装满背包的情况下,背包总是可以被装满的,我们如果要使总价值最高,那我们就应当提升平均的价值密度,那就把平均价值最高的顺次放入背包! 问题分析之0⑴背包问题为何我们不能用贪心算法来解决0⑴背包问题呢,我们只需要举1个反例就能够了,我们还是依照之前的将平均价值最大的放入背包里面,放入 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |