IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 分数背包问题-贪心法 -> 正文阅读

[数据结构与算法]分数背包问题-贪心法

一、问题如下:

给出n个大小为s1, s2,... , sn,价值为v1 ,v2,...,vn的物品,并设背包容量为C。

试设计一个贪心算法,找到非负实数x1,x2,…xn使和\sum xi*v i(从1到n求和),在约束\sum xi*si(从1到n求和)<=C下最大。

二、算法思想:

求解思路

1、先求出各个物品的价值与体积的比value_v(注意浮点数强制类型转换,代码31行

2、依据value_v排序。

3、优先存入此值大的物品。

4、若剩余空间不足存入整个物品,则按剩余空间存入部分即可。

(即此题与01背包问题区别是物品可拆分存入)

三、代码如下:

#include <bits/stdc++.h>

using namespace std;
#define N 1000

int n;//物品个数
int Bag=0;//背包容量

typedef struct ss{//定义物品结构体ss 
	int v;
	int value;
	float value_v;
}ss;

ss s[N];

void InputV(int n){//输入各物品体积 
	for(int i=0;i<n;i++){
		cin>>s[i].v;
	}
}

void InputValue(int n){//输入各物品价值
	for(int i=0;i<n;i++){
		cin>>s[i].value;
	}
}

void Setvalue_v(int n){//计算并存储各物品价值比 
	for(int i=0;i<n;i++){
		s[i].value_v=(float)s[i].value/s[i].v;//注意此处float强制类型转化 
	}
}

bool cmp(ss s1,ss s2){//以递减 
	return s1.value_v > s2.value_v;
}


int main(){
	cin>>n;//输入物品个数
	cin>>Bag;//输入背包容量
	InputValue(n);//输入各物品价值 
	InputV(n);//输入各物品体积
	Setvalue_v(n);//计算各物品价值比 
	sort(s,s+n,cmp);//按物品价值比递减排序 

	int Sum=Bag;//Sum存储背包剩余容量 
	float SumValue=0;//记录能存入背包的最大价值 
	for(int i=0;i<n;i++){
		if(Sum==0) break;//背包已装满,退出
		else if(Sum>=s[i].v){//装入整个体积的物品i 
			SumValue=SumValue+s[i].value;//将第i物品放入背包
			Sum=Sum-s[i].v;//背包空间变小 
		}
		else if(Sum<s[i].v){//装入部分体积的物品i 
			SumValue=SumValue+(float)Sum*s[i].value/s[i].v;
			Sum=0; 
		} 
	}
	if(SumValue!=0) cout<<SumValue<<endl;
	else cout<<" ";
	return 0;	
} 

四、示例?

1、示例输入:

3
20
25 24 15
18 15 10

2、示例输出?

31.5

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:57:48  更:2021-12-01 18:00:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:37:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码