贪心算法解决背包问题

问题描述:

给定 n 个物品和一个容量为 C 的背包,请给出物品装入背包的方案,使得背包中物品的总价值 M 最大,并满足:
1.每个物品 I 的重量为 wi,价值为 vi。
2.每个物品可拆分,背包中物品的总重量不能超过容量 C 。

实验要求:

程序要求:

1)先写排序算法 Rank(),本文中使用快速排序完成,再写贪心算法 Greedy()。
2)两个步骤需要单独定义在程序里,不写在主函数里。

贪心算法解背包问题的基本步骤:

1)计算每种物品单位重量的价值 Vi / Wi
2)依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。
3)若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。
4)依此策略一直进行下去,直到背包装满为止。

代码实现:

快速排序:

快速排序的实现主要部分是partition部分,partition是对数组针对某一个数(此处以 数组第一个元素为基础)来分区。注意参数列表中,index是设定的记录交换的数据,即在数组中数据交换位置的时候,用index数组来记录交换信息,等后续用index数组可以遍历到交换完位置的数据。

int Partition(double arr[],int index [], int left,int right){int i=left, j=right;
double x = arr[left];
while(i!=j){while(arr[j]>=x&&i<j) j--;while(arr[i]<=x&&i<j) i++;if(i>=j) break;swap(arr[i],arr[j]);swap(index[i],index[j]);
}
swap(arr[left],arr[i]);
swap(index[left],index[i]);return i;
} void rank(double arr[],int index[],int left,int right){if(left<right){int q=Partition(arr,index,left,right);rank(arr,index,left,q-1);rank(arr,index,q+1,right);}else return ;}

贪心算法:

贪心算法的核心逻辑为每次都进行最优的选择。在此处注意处理当背包恰好可以放下一个物品时,最好的逻辑选择是不进入做除法的操作,在for循环内部实现。

void Greedy(int n, double c, double w[], int b[], double x[]){int i;for(i=n-1;i>=0;i--){if(w[b[i]-1]>c) break;x[b[i]-1]=1;c-=w[b[i]-1];}if(i>=-1&&c>0) x[b[i]-1]=c/w[b[i]-1];
}

main函数测试:

运行前需要创建文件input.txt,写入读取的数据,同时创建output.txt文件,存放输出结果。

int main(){ifstream input("input.txt");//打开输入文件 if(!input)cout<<"The file can not open!!"<<endl;//文件打开失败 int n=0;double c;input>>c;//读入背包容量 double index[100],w[100],v[100];//定义索引数组,物品质量数组,物品价值数组 while(!input.eof()){input>>index[n]>>w[n]>>v[n];//按照顺序一次读取ID,物品价值,物品质量n++;}double totalvalue;double a[n],x[n];int b[n];for(int i=0;i<n;i++)x[i]=0;for(int i =0;i<n;i++){a[i]=v[i]/w[i];b[i]=i+1;}rank(a,b,0,n-1);Greedy(n,c,w,b,x);cout<<"The result is in the output.txt!"<<endl;ofstream output;output.open("output.txt");if(!output)cout<<"The file can not be open!!"<<endl; for(int i=0;i<n;i++){totalvalue+=v[i]*x[i];}output<<totalvalue<<endl;for(int i=0;i<n;i++){output<<i+1<<"\t"<<x[i]*w[i]<<"\t"<<v[i]*x[i]<<"\t";output<<endl;}}

运行结果


实验总结:

贪心算法可以解决背包问题,而不能解决0-1背包问题。贪心算法的核心思想是每次都做最优选择,因此在进行贪心算法的时候,首先需要考虑数据按照什么标准排序,贪心的选择按照排序进行,每次选择最优结果,选择后,问题规模下降。因此,贪心算法是自顶向下的算法。

贪心算法解决背包问题相关推荐

  1. 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

  2. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题

    前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做 ...

  3. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题示例

    本文实例讲述了JS基于贪心算法解决背包问题.分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局 ...

  4. 用贪心算法解背包问题(装载问题)

    题目描述 给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等.已知第 i 种食品的最多拥有Wi 公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大. 题 ...

  5. 使用ga算法解决背包问题_我如何使用算法解决现实生活中的手提背包的背包问题

    使用ga算法解决背包问题 I'm a nomad and live out of one carry-on bag. This means that the total weight of all m ...

  6. 贪心算法 背包问题 java_贪心算法求解背包问题

    一.贪心算法 1.贪心算法概念 贪婪算法(Greedy algorithm)是一种对某些求最优解问题的更简单.更迅速的设计技术.用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测 ...

  7. 用贪心算法解决马踏棋盘问题

    用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.

  8. 使用贪心算法解决最小生成树问题。

    使用贪心算法解决最小生成树问题. #include<iostream> #include<algorithm> using namespace std; const int M ...

  9. 算法设计与分析(第四周)贪心算法、背包问题

    贪心算法 顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算 ...

最新文章

  1. flux java_FluxJava 新增 RxJava2 的支援功能
  2. 在python中可以使用for作为变量名对吗,在Python中使用循环来命名变量
  3. 华为辞职门事件——再谈工作问题
  4. 微信小程序 监听位置信息
  5. C++ 封装Lua之我行我素
  6. JM代码阅读之一SODB RBSP EBSP NALU
  7. Itil v3 process model
  8. 华为终端穿戴软件测试,【华为软件测试工程师面试】总共五轮面试外加一个上机的性格测试。-看准网...
  9. Java项目前后端文件简体转换繁体
  10. C虾仔笔记 - HorizontalScrollView水平滚动视图
  11. java.lang.IllegalArgumentException: Result Maps collection already contains value for ciis.zht.model
  12. Vue3官网-高级指南(十五)Vue 与 Web Components
  13. 抖音终于活成了自己讨厌的样子
  14. nth-child 与 nth-of-type
  15. webpack打包之后在浏览器能看到源文件
  16. 〖Python 数据库开发实战 - Python与MySQL交互篇⑱〗- 项目实战 - 实现用户管理 - 删除用户
  17. 智慧环保-污水处理远程监控解决方案
  18. COMTRADE格式录波数据分析以及函数实现(一)
  19. java计算机毕业设计新生报到管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  20. 社会工程学——基础与认知建立

热门文章

  1. chrome inspect无法识别到手机解决方案之一
  2. 地表温度反演操作总结
  3. 生活有哪些残忍的真相?
  4. 【dsPIC33E】内部Flash读写
  5. 【图像检测】基于计算机视觉实现米粒个数检测含Matlab源码
  6. 【期末测验】: 课程水平综合测验 (第10周)
  7. OpenWrt PPPoE拨号问题之mac地址克隆
  8. JS代码清除localStorage缓存
  9. 张长水:图像识别与机器学习
  10. 关于自己的转正述职报告