【算法导论实验5】贪心-活动安排问题与背包问题

首先是活动安排问题。

贪心的关键在于排序策略。

思路很简单,对所有活动的结束时间排序,如果结束时间相同,因为要尽量多的参加活动,所以选取开始时间尽量晚的(这样可以安排的比较多),然后依次从早到晚选取不冲突的活动加入,即为最多可以参加的活动。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
using namespace std;

class activity
{
public:
     int start;
     int end;
};

activity lister[200];

bool cmp(activity a,activity b)
{
    if(a.end==b.end)
        return a.start>b.start;
    return a.end<b.end;
}

int main()
{
    //ofstream cout;
    //cout.open("OutputArrangement.txt");
    //文件输出的话,取消上一行注释和下边的注释.
    int testcase;
    cout<<"请输入活动数量:"<<endl;
    cin>>testcase;
    cout<<"请输入系列活动的开始时间和结束时间:"<<endl;

    for(int i=0;i<testcase;i++)
    {
        cin>>lister[i].start>>lister[i].end;
    }
    int nowtime=0,count=0;
    sort(lister,lister+testcase,cmp);//C++自带排序,位于#include <algorithm>,排序规则在function cmp中写明.
    for(int j=0;j<testcase;j++)
    {
        if(lister[j].start>=nowtime)
        {
	    cout<<"应该参加从"<<lister[j].start <<"到 "<<lister[j].end<<"的活动"<<endl;
            nowtime=lister[j].end;
            count++;
        }
    }

    cout<<"最多能够参加"<<count<<"个活动"<<endl;
    //cout.close();

    return 0;
}

背包问题。

首先要知道,0-1背包问题(要么放要么不放)贪心算法有可能不是最优解,可能只是次优解(因为存在那种价值很高但是质量很大的,能放进去的数量就有限了)。贪心算法能做的是部分背包问题。也就是说一个物品可以放进去一部分的那种。

策略也是按单位重量排序之后依次放入,到不能放为止。

//0-1背包问题使用贪心算法不能得到最优解,只能得到近似最优解
//0-1背包问题的dp状态转移方程:dp[j]=Max(dp[j],dp[j-value[i]]+weight[i])
//普通的背包问题可以使用贪心算法(每件物品可以放入一部分)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;

class Package
{
public:
    double weight;
    double value;
    double PerValue;//单位价值
};

Package packlist[1000];
double maxCapacity;

bool cmp(Package a,Package b)
{
    return a.PerValue>b.PerValue;
}

int main()
{
    //ofstream cout;
    //cout.open("ZeroOnepackOutput.txt");
    //文件输入输出的话注释掉
    int packnum;
    cout<<"请输入物品的总数量:";
    cin>>packnum;
    cout<<"请输入背包的最大容量:";
    cin>>maxCapacity;
    cout<<"请依次输入每件物品的重量和价值:";
    for(int i=0;i<packnum;i++)
    {
        cin>>packlist[i].weight>>packlist[i].value;
        packlist[i].PerValue=packlist[i].value/packlist[i].weight;
    }
    sort(packlist,packlist+packnum,cmp);

    double result=0;
    for(int i=0;i<packnum;i++)
    {
        if(packlist[i].weight<=maxCapacity)
        {
                cout<<"放入物品,价值为:"<<packlist[i].value<<" 重量为:"<<packlist[i].weight<<endl;
                result+=packlist[i].value;
                maxCapacity-=packlist[i].weight;
        }
        else
        {
                cout<<"放入一部分物品,价值为:"<<packlist[i].value<<"放入的重量为"<<packlist[i].PerValue*maxCapacity<<endl;
                result+=(maxCapacity*packlist[i].PerValue);
                break;
        }
    }
    cout<<"背包中的总质量是:"<<result<<endl;

    return 0;
}

如果想做题练习贪心算法的话,推荐HDU 1009 FatMouse‘ Trade 点击打开链接  和HDU
2037 今年暑假不AC 点击打开链接 讲的就是上边那两个问题。

【算法导论实验5】贪心-活动安排问题与背包问题,布布扣,bubuko.com

时间: 2024-10-10 17:32:07

【算法导论实验5】贪心-活动安排问题与背包问题的相关文章

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

hdu 2037简单贪心--活动安排问题

活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动能兼容地使用公共资源 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有 一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源

[算法导论]练习16.1-4 活动教室分配(区间着色问题)

题目: 有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室完成所有活动. 设计一个高效的贪心算法求每个活动应该在哪个教室进行. 分析: 本题是对书中活动选择问题的一个扩展.在活动选择问题中,我们要求的是一个最大兼容活动集,也就是在所有时间内时间不重叠的最多的活动集合. 易知,这样一个活动集,就是一个教室最多能够举办的活动集.所以剩下的活动一定不能和该活动集内的活动在同一个教室举行.我们不断对剩下的活动使用贪心算法,需要多少次贪心能够选取完所有的活动,就

[贪心]活动安排问题2

题目大意:有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 解题关键:策略: 按照开始时间排序优先安排活动,如果冲突,则加一个教室. 1.利用优先队列 1 #include<bits/stdc++.h> 2 #define INF 0X3F3F3F3F 3 using namespace std; 4 typedef long long ll; 5 string s; 6 pair<int,int>pp[

hdu2037-----------贪心, 活动安排问题

http://acm.hdu.edu.cn/showproblem.php?pid=2037(简单贪心-----活动安排) #include<iostream> #include<algorithm> using namespace std; struct Node { int l, r; }a[105]; bool Cmp(Node x, Node y) { if(x.r!=y.r) return x.r<y.r; else return x.l>y.r; } int

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有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相容. 由于输入的活动以其完成时间的非减序排列,所以算法

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

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

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