<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
貪婪演演算法總是作出在當前看來最好的選擇。也就是說貪婪演演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的區域性最優選擇。
問題描述: 設有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> #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 () ; // 第一個活動一定入內 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: // 按照活動結束時間非遞減排序 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 ;// 是否安排活動標誌 int m_nCount ; // 總活動個數 } ; 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 ; }
結果
演演算法虛擬碼【核心演演算法】
問題描述:
會場出租:選擇出租的活動時間不能衝突,怎樣選擇才能選更多的活動?
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開始前最後結束的活動 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; // 動態規劃 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+"結束時間"+S[k-1].endTime); k = p[k]; }else{ k--; } } } // 按結束時間從小到大排序 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); } }
結果
到此這篇關於C++與Java分別解決活動選擇問題和帶權活動選擇問題的文章就介紹到這了,更多相關C++活動選擇內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45