贪心算法运用于背包问题(C++实现)

贪心法的基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
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

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/ruanjianxiong/article/details/5378178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞