算法导论第十六章-贪心算法-Cpp代码实现

算法导论第十六章-贪心算法-Cpp代码实现

贪心算法其实是利用动态规划思想,简化后的一种方法。它强调的是贪心选择和最优子结构的结合。

利用贪心策略设计的算法很多,包括最小生成树算法,单源最短路径的Dijkstra算法等。这一章通过一个活动选择问题引出贪心算法,分别实现了递归贪心算法和迭代贪心算法两种。贪心算法还可以用来解决分数(部分)背包问题,但是不能用于解决0-1(完全)背包问题。16.2给出了贪心算法的原理说明。

Huffman树的构建也利用到了贪心原理,结合了prefix code的优势。这里Huffman树比较简单,这里代码没有实现。

greedy.h

#pragma once

/*************************************************
Author:董小歪
Date:2016-06-17
Description:算法导论第十六章-贪心算法-Cpp代码实现
**************************************************/

#ifndef GREEDY_H
#define GREEDY_H

#include <iostream>
#include <vector>
using namespace std;

class Greedy
{
public:
	vector<int> recursive_activity_selector(const vector<int> &s, const vector<int> &f);	//递归贪心算法
	vector<int> greedy_activity_selector(const vector<int>& s, const vector<int>& f);		//迭代贪心算法
private:
	void recursive_activity_selector(const vector<int> &s, const vector<int> &f, int k, int n, vector<int> &res);
};

#endif // !GREEDY_H


greedy.cpp
#include "greedy.h"

vector<int> Greedy::recursive_activity_selector(const vector<int> &s, const vector<int> &f)
{
	vector<int> res;
	recursive_activity_selector(s, f, 0, s.size() - 1, res);
	return res;
}

void Greedy::recursive_activity_selector(const vector<int> &s, const vector<int> &f, int k, int n, vector<int> &res)
{
	int m = k + 1;
	while (m <= n && s[m] < f[k])
		++m;
	if (m <= n)
	{
		res.push_back(m);
		recursive_activity_selector(s, f, m, n, res);
	}
}

vector<int> Greedy::greedy_activity_selector(const vector<int> &s, const vector<int> &f)
{
	int n = s.size();
	vector<int> res = { 1 };
	int k = 1;
	for (int m = 2; m < n; ++m)
	{
		if (s[m] >= f[k])
		{
			res.push_back(m);
			k = m;
		}
	}
	return res;
}

测试代码:

main_entrence.cpp

#include "greedy.h"

int main()
{
	Greedy greedy;
	const vector<int> s = { 0,1,3,0,5,3,5,6,8,8,2,12 };
	const vector<int> f = { 0,4,5,6,7,9,9,10,11,12,14,16 };
	cout << "活动开始时间Si:";
	for (auto i : s)
		cout << i << "\t";
	cout << endl << "活动结束时间Fi:";
	for (auto i : f)
		cout << i << "\t";
	vector<int> res = greedy.recursive_activity_selector(s, f);
	cout << endl << "递归贪心算法的结果是:";
	for (auto i : res)
		cout << i << " ";
	res = greedy.greedy_activity_selector(s, f);
	cout << endl << "迭代贪心算法的结果是:";
	for (auto i : res)
		cout << i << " ";
	cout << endl;
	system("pause");
}

测试结果:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值