活動選擇問題 動態規劃 貪心演算法

2021-07-04 21:37:40 字數 2381 閱讀 8293

問題描述:

有乙個需要使用每個資源的n個活動組成的集合s= ,資源每次只能由乙個活動使用。每個活動ai都有乙個開始時間和結束時間,且 0<= si < fi 《無窮 。一旦被選擇後,活動ai就佔據半開時間區間[si,fi)。如果[si,fi)和[sj,fj)互不重疊,則稱兩個活動是相容的。該問題就是要找出乙個由互相相容的活動組成的最大子集。

定義子集合sij = , 即每個活動都在ai結束之後開始,在aj開始之前結束,亦即sij包含了所有和ai和aj相容的活動。 

假設s中的活動已按照結束時間遞增的順序排列,則sij具有如下的性質:

1.當i <= j時,sij 為空,

2.假設ak屬於sij,那麼ak將把sij分解成兩個子問題,sij包含的活動集合就等於sik中的活動+ak+skj中的活動。從這裡就可以看出sij的最優子結構性質:sij的最優解包含了子問題sik和skj的最優解。假設sij的最大相容活動子集為aij,那麼有

aij = aik u  ak u akj。整個活動選擇問題的最優解也是s0,n+1的解。

假設c[i,j]為sij中最大相容子集中的活動數。則有如下遞迴式:

c[i,j] =         0                       如果 sij 為空

max  i < k < j & ak  sij  如果sij 不為空

根據這個遞迴式,可以得到乙個動態規劃解法。執行時間o(n^3)

#include #include using namespace std;

#define start 0

#define end 1

int activityselect(vector> set)}}

} return max;

}int main()

); //開頭標誌,不算這個

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back(); //結尾標誌,不算這個

cout << activityselect(set) << endl;

}

遞迴貪心演算法解法如下:執行時間o(n)

#include #include using namespace std;

#define start 0

#define end 1

int recursiveactivityselect(vector> set,int k)

int main()

); //開頭標誌,不算這個

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

cout << recursiveactivityselect(set,0) << endl;

}

迭代貪心演算法:執行時間o(n)

#include #include using namespace std;

#define start 0

#define end 1

int iterationactivityselect(vector> set)

} return result;

}int main()

); set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

set.push_back();

cout << iterationactivityselect(set) << endl;

}

活動選擇問題 動態規劃 貪心演算法

問題描述 設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si 從圖中可以看出s中共有11個活動,最大的相互相容的活動子集為 和。2 動態規劃解決過程 1 活動選擇問題的...

動態規劃 貪心演算法 活動選擇問題 收藏

問題描述和分析 演算法導論 p222 16.1活動選擇問題.這裡給出了動態規劃和貪心演算法兩種演算法的 view plaincopy to clipboardprint?動態規劃解法 include using namespace std const int n 11 int s n 2 int f...

活動選擇問題(動態規劃和貪心演算法)

有乙個由n個活動組成的集合s 1.這些活動使用同乙個資源,而這個資源在某一時刻只供乙個活動使用 2.每個活動都有乙個開始和結束時間si fi 如果被選中,則任務ai發生在半開時間區間 si,fi 3.如果兩個活動ai和aj不重疊,則稱兩個活動相容 活動選擇問題,希望選出乙個最大相容活動集 假設活動已...