【贪心法】分数背包问题

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

 一、问题如下:

给出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


目录
相关文章
|
5月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
184 2
动态规划算法学习三:0-1背包问题
|
5月前
|
存储 算法
算法之背包问题
本文讨论了可分背包问题和0-1背包问题的区别及解决方法,其中可分背包问题可以使用贪心算法解决,而0-1背包问题则通常采用动态规划方法来找到最大价值的解决方案。
64 0
算法之背包问题
|
算法 Python
贪心算法-分数背包问题(Python实现)
贪心算法-分数背包问题(Python实现)
137 0
|
10月前
|
算法 测试技术 C#
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
动态规划:分组背包问题
动态规划:分组背包问题
101 0
|
存储 算法
【趣学算法】Day3 贪心算法——背包问题
【趣学算法】Day3 贪心算法——背包问题
183 0
|
缓存 算法 网络协议
贪心法
贪心法是把一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解。贪心法的典型应用是求解最优化问题,而且对许多问题都能得到整体最优解,即使不能得到整体最优解,通常也是最优解的很好近似。
|
算法
【贪心法】会场安排问题
【贪心法】会场安排问题
277 0
|
存储
【贪心法】程序存储问题
【贪心法】程序存储问题
253 0