贪心算法---0/1部分背包问题
2013-04-02 18:17
323 查看
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大
选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解决。
首先计算每种物品单位重量的价值V/W,然后按单位重量价值从大到小进行排序,根据贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。或将这种物品全部装入背包后,背包内的物品总重量未超过背包容量,则选择单位重量价值次高的物品并尽可能多地装入背包,依此策略一直进行下去,直到背包装满为止。
代码如下:
选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解决。
首先计算每种物品单位重量的价值V/W,然后按单位重量价值从大到小进行排序,根据贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。或将这种物品全部装入背包后,背包内的物品总重量未超过背包容量,则选择单位重量价值次高的物品并尽可能多地装入背包,依此策略一直进行下去,直到背包装满为止。
代码如下:
#include<iostream> using namespace std; //部分背包问题,贪心算法,其中Goods第一列是物品重量,第二列是物品价值,Goods已经按照(物品价值/物品重量)进行从高到底排序 int PartBagProblem(int Goods[][2],int length,int maxvolume) { int i; int maxvalue = 0; for(i = 0;i < length;i++) { //如果是重量小于可以剩余的容量,则全部要了 if(Goods[i][0] < maxvolume) { maxvalue += Goods[i][1]; maxvolume -=Goods[i][0]; } else break; } if(maxvolume != 0) { maxvalue += (maxvolume * Goods[i][1])/ Goods[i][0] ; } return maxvalue; } int main() { int Goods[][2] = {{10,60},{20,100},{30,120}}; cout<<PartBagProblem(Goods,3,50); return 0; }
相关文章推荐
- NYOJ - 824 - Greedy Mouse(贪心算法--部分背包问题)
- 贪心算法;部分背包问题;快速排序O(nlgn);贪心算法O(n);
- 贪心算法实例(四):部分背包问题
- C++ 贪心算法部分背包问题
- 部分背包问题(贪心算法)
- 部分背包问题(贪心算法)
- 部分背包问题的贪心算法正确性证明
- 多重部分和问题 多重背包&& Coins POJ - 1742
- 贪心算法运用于背包问题(C++实现)
- 动态规划算法实现部分——0/1背包问题
- [贪心算法]java解决背包问题
- 挑战程序设计竞赛 多重部分和问题(恰好装满的完全背包)
- 用贪心算法实现的背包问题
- nyoj 题目106 :背包问题 贪心算法
- 背包问题(1)部分背包
- 0022算法笔记——【贪心算法】背包问题,最优装载问题
- 背包问题:动态规划和贪心算法
- 多重部分和问题 多重背包&& Coins POJ - 1742
- 部分背包问题-贪心法源码
- 算法篇-6-贪心算法-活动安排&背包问题&多机调度