贪心法的基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
贪心算法的运用-背包问题
背包问题和0/1背包问题的主要区别就是物品可不可以再分割。背包问题中的物品可以再进行分割,而0/1背包问题中的物品则反之。贪心算法往往只从局部去考虑问题,所以在解决0/1背包问题时得不到最优解。
贪心算法运用于背包问题的c++实现:
物品
A
B
C
D
F
重量
1
2
3
4
5
价值
3
10
6
3
5
程序代码: view plaincopy to clipboardprint?
//GreedyAlgorithm.h
#include<iostream>
using namespace std;
class GreedyAlgorithm{
public:
GreedyAlgorithm(int _weight[],int _value[],int capacity);
double *ComputeRatio();
void SortRatio(double _Ratio[]);
double ComputeProfit();
private:
int *weight;
int *value;
int capacity;
double profit;
};
//GreedyAlgorithm.cpp
#include"GreedyAlgorithm.h"
//================================
//函数名称:GreedyAlgorithm
//函数功能:初始化对象
//函数参数说明:_weight[] 物品重量,_value[] 物品价值,_capacity 背包容量
//函数返回值:void
//创建时间:2009-04-28
//更新:
//================================
GreedyAlgorithm::GreedyAlgorithm(int _weight[],int _value[],int _capacity){
this->weight=_weight;
this->value=_value;
this->capacity=_capacity;
this->profit=0;
return;
}
//================================
//函数名称:ComputeRatio
//函数功能:计算出物品的单位价值
//函数参数说明:
//函数返回值:double *
//创建时间:2009-04-28
//更新:
//================================
double *GreedyAlgorithm::ComputeRatio(){
double *Ratio=new double[5];
for(int i=0;i<5;i++)
Ratio[i]=(double)value[i]/weight[i];
return Ratio;
}
//================================
//函数名称:SortRatio
//函数功能:根据单位价值比大小,对物品的价值和重量进行排序
//函数参数说明:
//函数返回值:void
//创建时间:2009-04-28
//更新:
//================================
void GreedyAlgorithm::SortRatio(double _Ratio[]){
for(int i=0;i<5;i++)
for(int j=i+1;j<5;j++)
{
if(_Ratio[j]>_Ratio[i]){
int temp=weight[i];
weight[i]=weight[j];
weight[j]=temp;
temp=value[i];
value[i]=value[j];
value[j]=temp;
}
}
return;
}
//================================
//函数名称:ComputeProfit
//函数功能:计算背包的内所放物品的最大价值
//函数参数说明:
//函数返回值:double
//创建时间:2009-04-28
//更新:
//================================
double GreedyAlgorithm::ComputeProfit()
{
int temp=0;
int i=0;
while(temp<=capacity){
if(i==5) break;
else{
if((weight[i]+temp)<=capacity){
profit+=value[i];
temp+=weight[i];
}
else if((weight[i]+temp)>capacity){
int _weight=capacity-temp;
double _Ratio=(double)value[i]/weight[i];
profit+=_Ratio*_weight;
temp+=_weight;
}
}
i++;
}
return profit;
}
//main.cpp
#include<iostream>
#include"GreedyAlgorithm.h"
using namespace std;
int main(){
int _weight[5]={1,2,3,4,5};
int _value[5]={3,10,6,3,5};
int _capacity=7;
GreedyAlgorithm *greedy=new GreedyAlgorithm(_weight,_value,_capacity);
greedy->SortRatio(greedy->ComputeRatio());
cout<<"The Maximum Profit is: "<<greedy->ComputeProfit()<<endl;
return 0;
}
//GreedyAlgorithm.h
#include<iostream>
using namespace std;
class GreedyAlgorithm{
public:
GreedyAlgorithm(int _weight[],int _value[],int capacity);
double *ComputeRatio();
void SortRatio(double _Ratio[]);
double ComputeProfit();
private:
int *weight;
int *value;
int capacity;
double profit;
};
//GreedyAlgorithm.cpp
#include"GreedyAlgorithm.h"
//================================
//函数名称:GreedyAlgorithm
//函数功能:初始化对象
//函数参数说明:_weight[] 物品重量,_value[] 物品价值,_capacity 背包容量
//函数返回值:void
//创建时间:2009-04-28
//更新:
//================================
GreedyAlgorithm::GreedyAlgorithm(int _weight[],int _value[],int _capacity){
this->weight=_weight;
this->value=_value;
this->capacity=_capacity;
this->profit=0;
return;
}
//================================
//函数名称:ComputeRatio
//函数功能:计算出物品的单位价值
//函数参数说明:
//函数返回值:double *
//创建时间:2009-04-28
//更新:
//================================
double *GreedyAlgorithm::ComputeRatio(){
double *Ratio=new double[5];
for(int i=0;i<5;i++)
Ratio[i]=(double)value[i]/weight[i];
return Ratio;
}
//================================
//函数名称:SortRatio
//函数功能:根据单位价值比大小,对物品的价值和重量进行排序
//函数参数说明:
//函数返回值:void
//创建时间:2009-04-28
//更新:
//================================
void GreedyAlgorithm::SortRatio(double _Ratio[]){
for(int i=0;i<5;i++)
for(int j=i+1;j<5;j++)
{
if(_Ratio[j]>_Ratio[i]){
int temp=weight[i];
weight[i]=weight[j];
weight[j]=temp;
temp=value[i];
value[i]=value[j];
value[j]=temp;
}
}
return;
}
//================================
//函数名称:ComputeProfit
//函数功能:计算背包的内所放物品的最大价值
//函数参数说明:
//函数返回值:double
//创建时间:2009-04-28
//更新:
//================================
double GreedyAlgorithm::ComputeProfit()
{
int temp=0;
int i=0;
while(temp<=capacity){
if(i==5) break;
else{
if((weight[i]+temp)<=capacity){
profit+=value[i];
temp+=weight[i];
}
else if((weight[i]+temp)>capacity){
int _weight=capacity-temp;
double _Ratio=(double)value[i]/weight[i];
profit+=_Ratio*_weight;
temp+=_weight;
}
}
i++;
}
return profit;
}
//main.cpp
#include<iostream>
#include"GreedyAlgorithm.h"
using namespace std;
int main(){
int _weight[5]={1,2,3,4,5};
int _value[5]={3,10,6,3,5};
int _capacity=7;
GreedyAlgorithm *greedy=new GreedyAlgorithm(_weight,_value,_capacity);
greedy->SortRatio(greedy->ComputeRatio());
cout<<"The Maximum Profit is: "<<greedy->ComputeProfit()<<endl;
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/XIAODONGXIAN/archive/2009/04/28/4134663.aspx