【贪心法】分数背包问题

简介: 【贪心法】分数背包问题

 一、问题如下:

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

试设计一个贪心算法,找到非负实数x1,x2,…xn使和image.gif编辑(从1到n求和),在约束image.gif编辑(从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; 
}

image.gif

四、示例

1、示例输入:

3
20
25 24 15
18 15 10
image.gif

2、示例输出

31.5
image.gif


目录
相关文章
|
3月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
【自己动手画CPU】单总线CPU设计(三)
【自己动手画CPU】单总线CPU设计(三)
643 1
|
2月前
|
Apache 数据安全/隐私保护 Docker
【开源问答系统】GitHub 14.9k star 的开源问答引擎来了,三分钟搭建完成~~~
Apache Answer 是一款开源问答系统,助力团队将零散知识沉淀为结构化资产。支持 Docker 快速部署、插件扩展、权限控制与多语言,兼具高效搜索、投票排序与私有化部署能力,适用于技术社区、企业知识库与用户支持场景。
460 22
|
编解码 Java 测试技术
『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略
『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略
591 0
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
557 2
动态规划算法学习三:0-1背包问题
|
SQL 关系型数据库 数据库
17. Python 数据库操作之MySQL和SQLite实例
17. Python 数据库操作之MySQL和SQLite实例
476 2
|
运维 负载均衡 网络协议
LVS+Keepalived 负载均衡
LVS+Keepalived 负载均衡
320 8
LVS+Keepalived 负载均衡
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现
|
前端开发 JavaScript
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
该文章教授了如何使用Promise和async/await来解决异步编程问题,从而避免回调地狱,使代码更加清晰和易于管理。
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
|
存储 Go C语言
Python 的整数是怎么实现的?这篇文章告诉你答案
Python 的整数是怎么实现的?这篇文章告诉你答案
269 7