贪心算法

来源:互联网 发布:ip地址和mac地址的区别 编辑:程序博客网 时间:2024/06/15 11:50

按照自己的想法实现了一下:

#include <iostream>#include <vector>#include <iomanip>using namespace std;int main(){vector<char> things;int TotalWeight = 150;//vector<int> weights, values;int numThing = 7;vector<int> Index;char tmp = 'A';int total_weight=0, total_value=0;for(int i=0; i<numThing; i++){things.push_back(tmp);tmp++;}int weights[numThing]={35,30,60,50,40,10,25};//int weights[numThing]={35,30,60,50,40,15,20};int values[numThing]={10,40,30,50,35,40,30};//int values[numThing]={10,40,30,50,35,40,30};double value_weight[numThing];for(int i=0; i<numThing;i++){value_weight[i]=(double)values[i]/(double)weights[i];}//这里需要排序,是单纯记录位置还是直接用另一个容器表示。。//应该记录从大到小的索引值,存入一个队列/*  为了检验一下赋值以及求单位重量的价值,计算是否正确for(int i=0;i<numThing;i++){cout<<things[i]<<' ';cout<<value_weight[i]<<endl;}cout<<endl;*///冒泡排序//思想是,每趟排序能找到一个局部最大,所以n个数,需要n-1趟排序//由于冒泡排序会使得物品的顺序变化,因此创建一个新的数组用来对单位重量的价值进行排序,从大到小double tmparr[numThing];for(int i =0; i<numThing;i++){tmparr[i]=value_weight[i];}int maxIndex=0;double tmp_exchange=0.0;//冒泡for(int i=0; i<numThing-1; i++){for(int j=i+1; j<numThing; j++){if(tmparr[i]<tmparr[j]){tmp_exchange = tmparr[i];tmparr[i] = tmparr[j];tmparr[j] = tmp_exchange;//maxIndex = j;//Index.push(maxIndex);}}}//单位重量的价值从大到小存储在tmparr,然后用两层循环来确定其原始的索引值,依次存入Index[numThing],for(int i=0;i<numThing;i++){for(int j=0;j<numThing;j++){if(tmparr[i]==value_weight[j]){maxIndex=j;Index.push_back(maxIndex);}}}for(int i=0; i<numThing;i++){        //每行从左到右,分别是,索引号,对应的单位重量的价值,物品,重量,价值,按照从大到小排列cout<<Index[i]<<' '<<setiosflags(ios::fixed)<<setprecision(3)<<value_weight[Index[i]]<<' '<<things[Index[i]]<<' '<<weights[Index[i]]<<' '<<values[Index[i]]<<endl;}for(int i=0; i<numThing;++i){//如果150-weights[Index[i]]<weights[i]则跳出本次循环寻找合适的物品if(150<(weights[Index[i]]+total_weight)){continue;}else {total_weight+=weights[Index[i]];total_value+=values[Index[i]];//打印出每次加入背包的物品cout<<things[Index[i]];}}cout<<endl;cout<<"total_weight:"<<total_weight<<endl;cout<<"total_value:"<<total_value<<endl;}

运行结果如下图:


原创粉丝点击