活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;

#define NofActivity 11
int c[NofActivity + 1][NofActivity + 1];
int reme[NofActivity + 1][NofActivity + 1];
//活动的结构/////////////////////////////////////////
struct Activity
{
	int num;
	int start;
	int finish;
};

Activity Act[12] = { {0,0,0},{ 1,1,4 },{2,3,5 },{3, 0,6 },{4, 5,7 },{5, 3,9 },{6, 5,9 },{7, 6,10 },{8, 8,11 },{9, 8,12 },{10, 2,14 },{11, 12,16 }};

///用队列来存储符合条件的活动,递归版本
queue<Activity> select;
void Recursive_activity_selector(Activity* Act, int k, int n)
{
	int m = k + 1;
	while (m <= n&&Act[m].start < Act[k].finish)
		m++;
	if (m <= n)
	{
		select.push(Act[m]);
		Recursive_activity_selector(Act, m, n);
	}
}

///活动选择的迭代版本//////////////////////
void Greedy_activity_selector(Activity* Act)
{
	int n = NofActivity;
	while (!select.empty())select.pop();
	select.push(Act[1]);
	int k = 1;
	for (int i = 2; i <= n; i++)
	{
		if (Act[i].start > Act[k].finish) {
			select.push(Act[i]);
			k = i;
		}
	}
}

/////活动选择的动态规划版本//////////////////////////////////
void activity_selector(Activity* Act)
{
	queue<int> que;
	for (int i = 0; i <= NofActivity; i++)
	{
		c[i][i] = 0;
		c[0][i] = 0;
		c[i][0] = 0;
	}
	for(int l=2;l<=NofActivity;l++)
		for (int i = 1; i <= NofActivity-l+1; i++)
		{
			int j = i + l - 1;
			int m = i + 1;
			while (m <= j&&Act[m].start < Act[i].finish)
				m++;
			if (m > j)c[i][j] = 0;
			else
			{
				int temp = c[i][i];
				reme[i][j] = i;
				for(int k=i+1;k<=j;k++)
					if (c[i][k] + c[k][j] + 1 > temp)
					{
						temp = c[i][k] + c[k][j] + 1;
						reme[i][j] = k;
					}
				c[i][j] = temp;
			}
		}

}

int main()
{
	//Recursive_activity_selector(Act, 0, NofActivity);
	/*
	Greedy_activity_selector(Act);
	while (!select.empty())
	{
		cout << select.front().num<< ‘\t‘;
		select.pop();
	}
	*/
	activity_selector(Act);
	for (int i = 1; i <= NofActivity; i++) {
		for (int j = 1; j <= NofActivity; j++)
			cout << c[i][j] << ‘ ‘;
		cout << endl;
	}
	while (1);
    return 0;
}

  

时间: 2024-12-15 07:13:04

活动选择的贪心算法与动态规划(未完成)的相关文章

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[

活动选择问题--贪心

活动选择 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断.现在各个社团都提交了他们使用该中心的活动计划(即活动的开始时刻和截止时刻).请设计一个算法来找到一个最佳的分配序列,以能够在大学生艺术中心安排不冲突的尽可能多的社团活动. 比如有5个活动,开始与截止时刻分别为: 最佳安排序列为:1,4,5.

活动安排问题(贪心算法)

问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺利进行,即也就是每个活动的活动时间都互相不交叉,求m的最大值和 被选中的活动序号. 例如输入: 活动编号   活动开始时间    活动结束时间 1                1                       4 2                3                 

贪心算法和动态规划算法

动态规划和贪心算法都是一种递推算法 即均由局部最优解来推导全局最优解 (不从整体最优解出发来考虑,总是做出在当前看来最好的选择.) 不同点: 贪心算法 与动态规划的区别:贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留. 能使用贪心法求解的条件:是否能找出一个贪心标准.我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角.五分和一分,求最小找币数时,可以用贪心法求解:如果将这三种币值改为一角一分.五分和一分,就不能使用贪心

关于贪心算法和动态规划的学习 - 背包问题为例

说到背包问题,我看到了很多分类,不同的类似问题,有不一样的解法,看到的最多的两种方式是贪心算法和动态规划,于我来说,更迫切的应该是要认识一下,这些算法的区别和相同的地方,所以这节就来找资料学习一下贪心算法和动态规划的区别. 这是找到的一个对我帮助最大的,源地址:https://www.cnblogs.com/Renyi-Fan/p/7741089.html 看之前先摘一下这几个解决方案的区别:摘自网上 "所以一个问题,该用递推.贪心.搜索还是动态规划,完全是由这个问题本身阶段间状态的转移方式决定

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

贪心算法和动态规划的区别与联系

联系 1.都是一种推导算法 2.都是分解成子问题来求解,都需要具有最优子结构 区别 1.贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留: 动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解 2.贪心:如果把所有的子问题看成一棵树的话,贪心从根出发,每次向下遍历最优子树即可(通常这个"最优"都是基于当前情况下显而易见的"最优"):这样的话,就不需要知道一个节点的所有子树情况,于是构不

从 活动选择问题 看动态规划和贪心算法的区别与联系

这篇文章主要用来记录我对<算法导论> 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细请参考<算法导论> ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动选择问题的贪心算法求解 ④为什么这个问题可以用贪心算法求解? ⑤动态规划与贪心算法的一些区别与联系 ⑥活动选择问题的DP求解的JAVA语言实现以及时间复杂度分析 ⑦活动选择问题的Gr