最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++與Java分別解決活動選擇問題和帶權(quán)活動選擇問題

 更新時間:2022年06月30日 10:06:45   作者:成就一億技術(shù)人  
這篇文章介紹了C++與Java分別解決活動選擇問題和帶權(quán)活動選擇問題,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

貪心算法總是作出在當(dāng)前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上的局部最優(yōu)選擇。

活動安排問題

問題描述: 設(shè)有n個活動的集合E = {1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內(nèi)只有一個活動能使用這一資源。每個活i都有一個要求使用該資源的起始時間si和一個結(jié)束時間fi,且si < fi 。如果選擇了活動i,則它在半開時間區(qū)間[si, fi)內(nèi)占用資源。若區(qū)間[si, fi)與區(qū)間[sj, fj)不相交,則稱活動i與活動j是相容的。也就是說,當(dāng)si >= fj或sj >= fi時,活動i與活動j相容。

活動選擇問題代碼實現(xiàn)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std ;
struct ActivityTime
{
public:
    ActivityTime (int nStart, int nEnd) 
        : m_nStart (nStart), m_nEnd (nEnd) 
    { }
    ActivityTime ()
        : m_nStart (0), m_nEnd (0)
    { }
    friend 
    bool operator < (const ActivityTime& lth, const ActivityTime& rth) 
    {
        return lth.m_nEnd < lth.m_nEnd ;
    }
public:
    int m_nStart ;
    int m_nEnd ;
} ;
class ActivityArrange 
{
public:
    ActivityArrange (const vector<ActivityTime>& vTimeList) 
    {
        m_vTimeList = vTimeList ;
        m_nCount = vTimeList.size () ;
        m_bvSelectFlag.resize (m_nCount, false) ;
    }
    // 活動安排
    void greedySelector () 
    {
        __sortTime () ;
        // 第一個活動一定入內(nèi)
        m_bvSelectFlag[0] = true ;    
        int j = 0 ;
        for (int i = 1; i < m_nCount ; ++ i) {
            if (m_vTimeList[i].m_nStart > m_vTimeList[j].m_nEnd) {
                m_bvSelectFlag[i] = true ;
                j = i ;
            }
        }
        copy (m_bvSelectFlag.begin(), m_bvSelectFlag.end() ,ostream_iterator<bool> (cout, " "));
        cout << endl ;
    }
private:
    // 按照活動結(jié)束時間非遞減排序
    void __sortTime () 
    {
        sort (m_vTimeList.begin(), m_vTimeList.end()) ;
        for (vector<ActivityTime>::iterator ite = m_vTimeList.begin() ;
                ite != m_vTimeList.end() ; 
                ++ ite) {
            cout << ite->m_nStart << ", "<< ite ->m_nEnd << endl ;
        }
    }
private:
    vector<ActivityTime>    m_vTimeList ;    // 活動時間安排列表
    vector<bool>            m_bvSelectFlag ;// 是否安排活動標(biāo)志
    int    m_nCount ;    // 總活動個數(shù)
} ;
int main()
{
    vector<ActivityTime> vActiTimeList ;
    vActiTimeList.push_back (ActivityTime(1, 4)) ;
    vActiTimeList.push_back (ActivityTime(3, 5)) ;
    vActiTimeList.push_back (ActivityTime(0, 6)) ;
    vActiTimeList.push_back (ActivityTime(5, 7)) ;
    vActiTimeList.push_back (ActivityTime(3, 8)) ;
    vActiTimeList.push_back (ActivityTime(5, 9)) ;
    vActiTimeList.push_back (ActivityTime(6, 10)) ;
    vActiTimeList.push_back (ActivityTime(8, 11)) ;
    vActiTimeList.push_back (ActivityTime(8, 12)) ;
    vActiTimeList.push_back (ActivityTime(2, 13)) ;
    vActiTimeList.push_back (ActivityTime(12, 14)) ;
    ActivityArrange aa (vActiTimeList) ;
    aa.greedySelector () ;
    return 0 ;
}

結(jié)果

帶權(quán)活動選擇問題

算法偽代碼【核心算法】

問題描述:

會場出租:選擇出租的活動時間不能沖突,怎樣選擇才能選更多的活動?

帶權(quán)活動選擇問題代碼實現(xiàn)

package day1.java;
public class activityChoose {
    private static class Activity{
        int startTime;
        int endTime;
        int weight;
        private Activity(int startTime, int endTime, int weight){
            this.startTime = startTime;
            this.endTime = endTime;
            this.weight = weight;
        }
    }
    private static void activityChoose(Activity[] S){
        // 記錄p:在a_i開始前最后結(jié)束的活動
        int[] p = new int[S.length+1];
        p[0] = 0;
        p[1] = 0;
        for(int i=2; i<=S.length; i++){
            for(int j=i-1; j>0; j--){
                if(S[j-1].endTime <= S[i-1].startTime){
                    p[i] = j;
                    break;
                }
            }
        }
        for(int i=1; i<=S.length; i++){
            System.out.println(p[i]);
        }
        int[] D = new int[S.length+1];
        int[] Rec = new int[S.length+1];
        D[0] = 0;
        // 動態(tài)規(guī)劃
        for(int j=1; j<S.length+1; j++){
            if(D[p[j]]+S[j-1].weight > D[j-1]){
                D[j] = D[p[j]] + S[j-1].weight;
                Rec[j] = 1;
            }else{
                D[j] = D[j-1];
                Rec[j] = 0;
            }
        }
        // 輸出方案
        int k=S.length;
        while(k > 0){
            if(Rec[k] == 1){
                System.out.println("選擇:開始時間"+S[k-1].startTime+"結(jié)束時間"+S[k-1].endTime);
                k = p[k];
            }else{
                k--;
            }
        }
    }
    // 按結(jié)束時間從小到大排序
    private static void quickSortActivity(Activity[] S, int start, int end){
        int i = start;
        int j = end;
        if (start < end){
            Activity tmp = S[i];
            while(i<j){
                while(i<j && S[i].endTime <= S[j].endTime){
                    j--;
                }
                S[i] = S[j];
                while (i < j && S[i].endTime >= S[j].endTime) {
                    i++;
                }
                S[j] = S[i];
            }
            S[i] = tmp;
            quickSortActivity(S, start, i-1);
            quickSortActivity(S, i+1,end);
        }
    }
    public static void main(String[] args){
        Activity[] S = new Activity[10];
        S[0] = new Activity(1,4,1);
        S[1] = new Activity(3,5,6);
        S[2] = new Activity(0,6,4);
        S[3] = new Activity(4,7,7);
        S[4] = new Activity(3,9,3);
        S[5] = new Activity(5,9,12);
        S[6] = new Activity(6,10,2);
        S[7] = new Activity(8,11,9);
        S[8] = new Activity(8,12,11);
        S[9] = new Activity(2,14,8);
        quickSortActivity(S, 0, 9);
        activityChoose(S);
    }
}

結(jié)果

到此這篇關(guān)于C++與Java分別解決活動選擇問題和帶權(quán)活動選擇問題的文章就介紹到這了,更多相關(guān)C++活動選擇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)出棧序列

    C語言實現(xiàn)出棧序列

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)出棧序列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++中const應(yīng)放在類型前還是后

    C++中const應(yīng)放在類型前還是后

    之前遇到小伙伴問C++中const加在類型名前和變量名前的區(qū)別,今天給大家簡單分析下。
    2016-05-05
  • 關(guān)于C++函數(shù)模版的實現(xiàn)講解

    關(guān)于C++函數(shù)模版的實現(xiàn)講解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++函數(shù)模版的實現(xiàn)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • c語言printf實現(xiàn)同一位置打印輸出的實例

    c語言printf實現(xiàn)同一位置打印輸出的實例

    下面小編就為大家?guī)硪黄猚語言printf實現(xiàn)同一位置打印輸出的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • C++?和?C#?中的?lambda的方法技巧

    C++?和?C#?中的?lambda的方法技巧

    這篇文章主要介紹了C++?和?C#?中的?lambda的方法技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • C語言課程設(shè)計之停車場管理問題

    C語言課程設(shè)計之停車場管理問題

    這篇文章主要為大家詳細(xì)介紹了C語言課程設(shè)計之停車場管理問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    這篇文章主要介紹了詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 共用體的定義與應(yīng)用詳細(xì)解析

    共用體的定義與應(yīng)用詳細(xì)解析

    共同體的定義類似結(jié)構(gòu)體,不過共同體的所有成員都在同一段內(nèi)存中存放,起始地址一樣,并且同一時刻只能使用其中的一個成員變量
    2013-08-08
  • C語言結(jié)構(gòu)體指針的具體使用

    C語言結(jié)構(gòu)體指針的具體使用

    結(jié)構(gòu)體指針是一種非常有用的數(shù)據(jù)類型,它可以讓我們更方便地操作結(jié)構(gòu)體,本文主要介紹了C語言結(jié)構(gòu)體指針的具體使用,非常具有實用價值,需要的朋友可以參考下
    2023-05-05
  • error LNK2019: 無法解析的外部符號 問題的解決辦法

    error LNK2019: 無法解析的外部符號 問題的解決辦法

    error LNK2019: 無法解析的外部符號 問題的解決辦法,需要的朋友可以參考一下
    2013-05-05

最新評論

长乐市| 新乐市| 谢通门县| 郧西县| 井陉县| 即墨市| 阿勒泰市| 平顶山市| 兴文县| 北碚区| 容城县| 乾安县| 上虞市| 龙里县| 江油市| 土默特左旗| 海城市| 绩溪县| 蚌埠市| 龙山县| 靖安县| 青神县| 封开县| 长汀县| 美姑县| 仙游县| 平舆县| 九江县| 桦南县| 乐清市| 宁波市| 宁河县| 赤壁市| 新疆| 邢台县| 河池市| 万全县| 五莲县| 永善县| 亳州市| 阿尔山市|