贪心算法的思想:
贪心算法不是某种特定的算法,而是一类抽象的算法,或者说只是一种思想,它的具体表现在,对解空间进行搜索时,不是机械地搜索,而是对局部进行择优选取,贪心算法的目的不是为了找到全部解,也当然找不出最优解,而只是找出一种可行解,这样效率就比较高。因此,贪心算法也叫启发式搜索,这种启发就是所谓的 “贪心策略”。
贪心法是一种改进了的分级处理方法。用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。
背包问题:
已知有n个物品和一个可容纳M重量的背包,物品i的效益值为P(i),重量为W(i).假设将物体i的一部分x(i)(1<=i<=n, 0<=xi<=1)装入背包中,则有价值pi*xi。采用怎样的方法才能使所装入的物品总的效益值最大。如果从实际来看,物品一般是不能够分割的,这也就是0/1背包问题。
基于0/1背包问题寻求最优决策。要想得到最优解,就要在效益增长和背包容量消耗两者之间寻找平衡。也就是说,总应该把那些单位效益最高的物体先放入背包。
程序实现:
本例采用c++语言实现,单位效益值比较采用冒泡排序算法按效益值降序排列。冒泡排序在数据量比较小的时候,复杂度还是可以承受的;当数据量大的时候,可以选择归并、快速排序等算法。
源码如下:
#include <iostream>
using namespace std;
typedef struct{
float price;
float weight;
}Data;
class BagCupidity{
Data *data,*result;
int number; //数据个数
float cue;//背包容量
void sort();
int count; //counter
public:
void BagPrograme();
BagCupidity();
~BagCupidity(){
delete data;
delete result;
}
};
void BagCupidity::sort(){ //按效益值与重量比的降序进行排序
Data swap,change;
int j=0;
for(int i=0;i<number&&data!=NULL;i++){
swap=data[i];
for(j=i;j<number&&data!=NULL;j++){
if((swap.price/swap.weight)<(data[j].price/(data[j].weight))){
change.price=swap.price;
change.weight=swap.weight;
swap.price=data[j].price;
swap.weight=data[j].weight;
data[j].price=change.price;
data[j].weight=change.weight;
}
}
}
}
BagCupidity::BagCupidity(){
data=NULL;
number=0;
count=0;
cout<<“请指定背包容量”<<endl;
cin>>cue;
cout<<“准备输入多少个数据?”<<endl;
cin>>number;
data=new Data[number];
result=new Data[number];
cout<<“正在输入数据……”<<endl;
cout<<“依次输入物体的效益值和重量”<<endl;
for(;count<number;count++){
cin>>data->price>>data->weight;
++data;
}
while(count>0){
–data; //指针回退
–count;
}
cout<<“输入数据完成”<<endl;
}
void BagCupidity::BagPrograme(){
sort();
int num=0;
while(num<number){
if(data[num].weight<cue){
cue-=data[num].weight;
result[count].price=data[num].price;
result[count].weight=data[num].weight;
++count;
}
++num;
}
while(count>0){
–count;
cout<<“效益值:”<<result[count].price<<“/t重量:”<< result[count].weight<<endl;
}
}
int _tmain(int argc, _TCHAR* argv[]){
BagCupidity bag;
cout<<“结果如下”<<endl;
bag.BagPrograme();
return 0;
}
结语:
该程序在visual studio 2005调试成功,并能正常执行。