分数背包问题(贪心算法)

#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;

/*
*分数背包问题(贪心算法)
*/

struct goods
{
	double  value;//物品的价值
	double  weight;//物品的重量
	double  ratio;//物品的性价比
	double in;//物品装入背包的重量
	int index;//物品的编号
	friend ostream & operator<<(ostream & o,const goods & g);
	friend istream & operator>>(istream & o,goods & g);
};

ostream & operator<<(ostream & o,const goods & g)
{
	o<<"物品编号:  "<<g.index<<" 物品装入背包的重量 "<<g.in<<endl;
	return o;
}
istream & operator>>(istream & o,goods & g)
{
	o>>g.index>>g.weight>>g.value;
	g.ratio = g.value/g.weight;
	return o;
}

bool cmp(goods g1,goods g2)
{
	if(g1.ratio>g2.ratio)
	{
	  return true;
	}else
	{
		return false;
	}
}

double knapsack(vector<goods>  & vec,double v)
{
	//先将货物按照性价比排序
	sort(vec.begin(),vec.end(),cmp);
	//从性价比高的开始装入背包
	double l = v;//背包的剩余容量
	double sum = 0;//背包的总价值
	for (int i = 0; i < vec.size(); i++)
	{
		if(l>0)
		{
			if(l>vec[i].weight)
			{
				l -= vec[i].weight;
				vec[i].in = vec[i].weight;
				sum += vec[i].value;
			}
			else
			{
				vec[i].in = vec[i].weight - l;
				sum += l*vec[i].ratio;
				l =0;
				break;
			}

		}
	}
	return sum;
}

int main()
{
	vector<goods> vec_goods;//可选物品向量
	//输入可选物品
	copy(istream_iterator<goods>(cin),istream_iterator<goods>(),back_inserter(vec_goods));
	double wei_bag;//背包的承载最大重量
	cin.clear();
	cin.sync();
	cin>>wei_bag;
	double max_v = knapsack(vec_goods,wei_bag);
	cout<<"背包可以装载的最大价值为:  "<<max_v<<endl;
	cout<<"分别承载的物品和重量为"<<endl;
	copy(vec_goods.begin(),vec_goods.end(),ostream_iterator<goods>(cout,"  "));
	cout<<endl;
}

时间: 2024-08-02 09:03:53

分数背包问题(贪心算法)的相关文章

NYOJ~106~背包问题~贪心算法~

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

背包问题(贪心算法)

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题.贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细节想不通.这个问题以后有机会再讲.本次讲一讲背包问题. 背包问题就是有若干物品,每个物品有自己的价值和重量.背包有总重

JAVA算法基础-贪心算法

前言 学无止境.算法博大精深啊,一个贪心算法里面就隐含了这么多不同的场景实现,每个场景下的算法就有多种不同的实现,个人写法不一也成就了各种不同的漂亮算法,看了这些实现,也让我开拓了思维,这个世界的方案永远没有最完美的只有最合适的- ! 1.贪心算法概念 贪心算法也叫贪婪算法,当然叫法随意.主要目的是在问题求解时,做出最正确的判断= =,这不是贪心是啥?在计算机工程领域当中,就是说不考虑整体最优算法而是从局部做到最优解.当然贪心是算法不能对所有的问题都能得到整体都最优解,但对多数个问题还是能得到近

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

背包问题:动态规划和贪心算法

1. 动态规划 以下关于动态规划的文字描述来源 动态规划之背包问题(一) 作者:Hawstein 出处:http://hawstein.com/posts/dp-knapsack.html 一切都要从一则故事说起. 话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个. 但他身上能装宝石的就只有一个背包,背包的容量为C.这哥们把n个宝石排成一排并编上号: 0,1,2,-,n-1.第i个宝石对应的体积和价值分别为V[i]和W[i] .排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西

贪心算法之背包问题

贪婪算法的基本思想:通过一系列步骤来构造问题的解,每一步都是对已构造的部分解的一个扩展,直到获得问题的完整解. 贪婪算法中,每一步“贪婪地” 选择最好的部分解,但不顾及这样选择对整体的影响(局部最优),因此得到的全局解不一定最好的解,但对许多问题它能产生整体最优解. 具体算法描述: public static void Greedy()        {            float cu = c;            int temp = 0;            int i = 0;

数据结构之贪心算法(背包问题的思考)-(十)

贪心策略.关于贪心算法的思考,思考过程都放在代码中了. package com.lip.datastructure; /** *贪心算法:装箱问题的思考 * @author Lip *装箱问题可以是时间调问题的延伸,当一个箱子没有容积限制,那么就是时间调度问题 *在时间调度问题中:存在两个可以讨论的问题.1.平均最短时间 2.总的最短时间 *这两个问题都和装箱问题中问题如此类似. */ /* * 上面是我理解的装箱问题,本来是想说背包问题的 * 背包问题的描述:有N件物品和一个容量为V的背包.第

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部