贪心算法 —— 背包问题

一、问题描述:有一堆宝物,用车去装载,一次运完(不能超过车的最大承重),要求运走价值高的宝物

这里因为物体是可分割的,所以我采用贪心算法。由题目可以得出,应该选取性价比最高的物品,即:价值/重量要最大才行。所以思路就出来了,每次选择性价比高的物品,如果其重量小于车的载重就装,如果大于就分割,部分装入。话不多说,直接上代码。

二、代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
const int M = 1000005;  

struct three{  
	double weight;
	double value;
	double per;  //性价比 
}s[M];  

bool compare(three a,three b){
		return a.per>b.per;   //定义从大到小排序 
}

int main(void){
	int n;  //宝物总个数
	double m;   //最大载重量 
	cout<<"请输入宝物总个数和最大载重量:"<<endl;
	cin>>n>>m;
	cout<<"请输入宝物的重量和价值:"<<endl;
	for(int i=0; i<n; i++){
		cin>>s[i].weight>>s[i].value;
		s[i].per = s[i].value/s[i].weight;
	} 
	sort(s,s+n,compare);     
	double sum = 0.0;  //运走的宝贝
	for(int i=0; i<n; i++){      
		if(m>s[i].weight){
			m = m - s[i].weight;
			sum = sum + s[i].value;
		} else {     // 部分装入
			sum = sum + m*s[i].per;
			break;    
		}
	} 
	cout<<"可运走的宝物最大价值为:"<<sum<<endl; 
	return 0;
}

时间复杂度为:O(nlogn)

三、贪心算法的本质:

个人理解是贪心算法并不是从全局整体去进行考虑,算法做出的选择只是从某种意义上来说的局部最优,所以在特殊情况下,它只能得到整体最优的近似,例如0-1背包问题,针对这个问题使用动态规划就要好得多。所以就根据具体问题不同对待吧。反正我是怎么简单怎么来,只要能得出结果就行[doge]。

(原创不易,点个赞再走吧~)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值