背包问题贪心算法求解
题目
有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
思路
具有最优子结构性质和贪心选择性质。只要是所有物品的总重量大于背包容纳量,那么背包一定能装满。注意背包问题与0-1背包问题的区别。
这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。
求解步骤
用贪心算法解背包问题的基本步骤:首先计算每种物品单位重量的价值v[i]/w[i],然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。
代码实现
#include <iostream>
using namespace std;
//按照单位重量的价值量大小降序排列
void Sort(int n,float *w,float *v)
{int i,j;float temp1,temp2;for(i=1;i<=n;i++)for(j=1;j<=n-i;j++)//冒泡排序{temp1=v[j]/w[j];temp2=v[j+1]/w[j+1];if(temp1<temp2){swap(w[j],w[j+1]);swap(v[j],v[j+1]);}}
}
int main()
{float w[101];//用来表示每个物品的重量float v[101];//用来表示每个物品的价值量float x[101];//表示最后放入背包的比例int n;//物品数float M;//背包最大容纳重量cin>>n>>M;//依次输入每件物品的重量和价值量for(int i=1;i<=n;i++)cin>>w[i]>>v[i];//按照单位重量的价值量大小降序排列Sort(n,w,v);int i;for(i=1;i<=n;i++)x[i]=0;//初始值,未装入背包,x[i]=0float c=M;//更新背包容纳量for(i=1;i<=n;i++){if(c<w[i]) break;//不能完全装下x[i]=1;c=c-w[i];}if(i<=n)x[i]=c/w[i];//输出for(int i=1;i<=n;i++)cout<<"重量为"<<w[i]<<"价值量为"<<v[i]<<"的物品"<<"放入的比例为"<<x[i]<<endl;return 0;
}
算的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为O(nlogn)。
为了证明算法的正确性,还必须证明背包问题具有贪心选择性质。
对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征。
实际上也是如此,动态规划算法的确可以有效地解0-1背包问题。
背包问题贪心算法求解相关推荐
- 贪心算法 背包问题代码 c语言,用贪心算法求解普通背包问题的C++代码
用贪心算法求解普通背包问题的C++代码 2019年3月6日 125次阅读 来源: 贪心算法 #include #define M 100 void display(int &n,doubl ...
- 贪心算法 背包问题 java_贪心算法求解背包问题
一.贪心算法 1.贪心算法概念 贪婪算法(Greedy algorithm)是一种对某些求最优解问题的更简单.更迅速的设计技术.用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测 ...
- c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法
贪心算法 正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质.满足这两个条件的话就可以尝试用贪心算法解决问题. 贪心选择 ...
- 贪心算法求解TSP问题(python)
这里使用贪心算法求解TSP问题的python版本 # dist 为距离矩阵,start_index 为起始位置 def tsp_quick(dist: list, start_index: int): ...
- 基于贪心算法求解TSP问题(JAVA)
前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.demod ...
- tsp java_基于贪心算法求解TSP问题(JAVA)
前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TPS问题 TSP问题(Travelling ...
- C++贪心算法求解找零钱问题(很形象)
贪心算法求解找零钱问题 1.什么是贪心算法? 贪心算法是一种策略,总是做出在当前看来是最好的选择,总结出来几个字:寻找最优解 举个例子来说就是:"有一个只能往前走的果园,里边有各种水果让你免 ...
- 贪心算法求解 TSP 旅行商问题及其实现
文章目录 一.TSP 概述 1. TSP 2. 数学模型 3. TSP分类 二.贪心算法 1. 算法思路 2. 算法框架 3. 问题 三.贪心算法求解 TSP 一.TSP 概述 1. TSP 旅行商问 ...
- 贪心算法求解一个序列中出现次数最多的元素问题
贪心算法求解一个序列中出现次数最多的元素问题 题目: 指定n个正整数,编写一个实验程序找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入描述:输入的第1行只有一个正整数n(1 ...
最新文章
- android方法中添加 N,Android N 新功能 - 添加快速设定
- Work Management Service application in SharePoint 2016
- Oracle学习:常用语句
- mybatis源码阅读(三):mybatis初始化(下)mapper解析
- 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
- 汉诺塔VII(递推,模拟)
- Qt实践录:串口调试助手
- VMware NSX part 1(介绍) part 2(NSX-Manager安装) part 3(NSX Controller部署)
- micropython和python区别-(一)什么是MicroPython?
- c++折线平移算法_【MITA周刊】第十五周:聚类算法
- 在 Google 工作是什么体验?
- java文件复制方法_Java复制文件–用Java复制文件的4种方法
- 程序员就该这么悲催么? 996下的我们何去何从
- flash和js通过什么类进行交互?
- Android绘图Porter-Duff规则
- 电脑无法连接WiFi,一直显示无法连接此网络
- Collecting Bugs (DP期望)
- java多线程归并排序_并行计算实验-串、并行排序算法
- java前后端分离框架_Spring Boot 入门及前后端分离项目实践
- 服务器怎么防ddos攻击
热门文章
- python猴子分桃子的数学题_python编程练习-分桃子
- upc Cafebazaar’s Chess Tournament 思维 + FFT
- 【值得读】自动机器学习: 最新进展综述与开放挑战 | AutoML
- linux c 获取进程p id,详解Linux获取线程的PID(TID、LWP)的几种方式
- html画流程图插件,基于SVG的流程图插件Flowchart.js
- 流利阅读day1 Dysmorphia
- mysql sql 列变成横向_mysql怎么更改纵向变横向排列
- 安全的网络通道——网络准入之三层准入
- 音乐代码 (DNF天空之城、欢乐颂)。
- 嵌入式编程规范与原则