贪心算法

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

#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;


}

运行结果如下图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值