[C++] 贪心算法之活动安排、背包问题
一、贪心算法的基本思想
在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解。
从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。
二、贪心算法的基本要素
(1)最优子结构性质
(2)贪心选择性质(局部最优选择)
三、贪心算法实例
1、活动安排
设有n个活动的集合 E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动 i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi,且 si < fi。如果选择了活动i,则它在半开时间区间 [si ,fi ) 内占用资源。若区间 [si , fi )与区间 [sj, fj ) 不相交,则称活动i与活动j是相容的。当 si ≥ fj 或 sj ≥ fi 时,活动 i 与活动 j 相容。
活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。
例如:
#include <iostream>
using namespace std; #define NUM 50 void GreedySelector(int n, int s[], int f[], bool b[])
{
b[]=true; //默认将第一个活动先安排
int j=; //记录最近一次加入b中的活动 //依次检查活动i是否与当前已选择的活动相容
for(int i=;i<=n;i++)
{
if (s[i]>=f[j])
{
b[i]=true;
j=i;
}
else
b[i]=false;
}
} int main()
{
int s[] = {,,,,,,,,,,,}; //存储活动开始时间
int f[] = {,,,,,,,,,,,}; //存储活动结束时间
bool b[NUM]; //存储被安排的活动编号
int n = (sizeof(s) / sizeof(s[])) - ; GreedySelector(n, s, f, b); for(int i = ; i <= n; i++) //输出被安排的活动编号和它的开始时间和结束时间
{
if(b[i]) cout << "活动 " << i << " :" << "(" << s[i] << "," << f[i] << ")" <<endl;
}
return ;
}
2、背包问题
给定一个载重量为 M 的背包,考虑 n 个物品,其中第 i 个物品的重量 wi(1 ≤ i ≤ n),价值 vi(1 ≤ i ≤ n),要求把物品装满背包,且使背包内的物品价值最大。
有两类背包问题(根据物品是否可以分割),如果物品不可以分割,称为 0—1 背包问题(动态规划);如果物品可以分割,则称为背包问题(贪心算法)。
例如:
有3种方法来选取物品:
(1)当作 0—1 背包问题,用动态规划算法,获得最优值 220;
(2)当作 0—1 背包问题,用贪心算法,按性价比从高到底顺序选取物品,获得最优值 160。由于物品不可分割,剩下的空间白白浪费。
(3)当作背包问题,用贪心算法,按性价比从高到底的顺序选取物品,获得最优值 240。由于物品可以分割,剩下的空间装入物品 3 的一部分,而获得了更好的性能。
图2.1 背包问题
#include <iostream>
using namespace std; #define NUM 50 //这里假设 w[], v[] 已按要求排好序
void Knapsack(int n,float M,float v[],float w[],float x[])
{
int i;
for(i = ; i <= n; i++) x[i] = ; //初始化数组
float c = M;
for(i = ;i <= n; i++) //全部被装下的物品,且将 x[i] = 1
{
if(w[i]>c) break;
x[i] = ;
c -= w[i];
} if(i <= n) x[i] = c / w[i]; //将物品i 的部分装下
} int main()
{
float M = ; //背包所能容纳的重量
float w[] = {,,,}; //这里给定的物品按价值降序排序
float v[] = {,,,};
float x[NUM]; //存储每个物品装入背包的比例 int n = (sizeof(w) / sizeof(w[])) - ; Knapsack(n, M, v, w, x); for(int i = ; i <= n; i++)
cout << "物品 " << i << " 装入的比例: " << x[i] << endl;
return ;
}
[C++] 贪心算法之活动安排、背包问题的更多相关文章
- 贪心算法求解活动安排<算法分析>
一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤 ...
- C++贪心算法实现活动安排问题
问题描述: 设有n个活动的集合E={1,2,…,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...
- 51nod贪心算法入门-----活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...
- 51nod贪心算法入门-----活动安排问题2
题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. #inclu ...
- 雷达覆盖,贪心,类似活动安排(POJ1328)
题目链接:http://poj.org/problem?id=1328 解题报告: 1.按照头结点排序. #include <cstdio> #include <cmath> ...
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- 忙碌的Nova君 (活动安排问题、贪心算法)
题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
- 贪心算法_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:[梁敬明的博客] 1.贪心算法 什么是贪心算法?是指在对问题进 ...
随机推荐
- CentOS 6.5下Redmine的安装配置
首先引用百度介绍下redmine: Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不 ...
- Qt开发动画
#include <QPropertyAnimation> #include <QDesktopWidget> //下坠 void MainWindow::on_pushBut ...
- [Android]libpng error: Not a PNG file错误解决
我在将以前在Eclipse中写的项目import到android studio中后,出现了 AAPT err(Facade for 157667509): libpng error: Not a PN ...
- codeforces Codeforces Round #318 div2 A. Bear and Elections 【优先队列】
A. Bear and Elections time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Linux 一键安装 webmin/virtualmin
Webmin是一个可运行于Linux/freebsd的web界面的主机管理系统,而Virtualmin是一个基于Webmin的虚拟主机管理模块. webmin官方站: http://www.webmi ...
- mysql-用命令导出、导入表结构或数据
1. 导出整个数据库(表结构和数据) mysqldump -u用户名 -p 数据库名 > 导出的文件名 [root@localhost work]# mysqldump -uroot -p m ...
- 【P2629】好消息,坏消息(前缀和+单调队列优化DP)
一激动一颓就会忘了总结... 前面的大黄题就不总结了. 这个题我只想说一声艹,一开始的思路就是正确的,然后计算的时候有了一个瑕疵,不过很快也就改过来了.然后却一直连样例都过不了.仔仔细细看了老半天,经 ...
- 生成 (web): 找不到目标 .NET Framework 版本的引用程序集;请确保已安装这些程序集或选择有效的目标版本。
刚刚还好好的,不知道修改什么了,突然出现如下错误: Default.aspx(36): 生成 (web): 找不到目标 .NET Framework 版本的引用程序集:请确保已安装这些程序集或选择有效 ...
- linux平台及windows平台mysql重启方法
各个平台mysql 重启: inux平台及windows平台mysql重启方法 Linux下重启MySQL的正确方法: 1.通过rpm包安装的MySQL service mysqld restart ...
- nginxif多条件结合判断(实现限速)
参考文章: https://yq.aliyun.com/articles/44957 需求: 要对某一ip下,使用android客户端的用户进行限速 原理 就是用SET变量进行. AND 就用变量叠加 ...