問題描述:
有乙個需要使用每個資源的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不重疊,則稱兩個活動相容 活動選擇問題,希望選出乙個最大相容活動集 假設活動已...