按照自己的想法实现了一下:
#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;
}
运行结果如下图: