活動安排問題
設有n個活動的集合E={1,2,3,…,n},所有的活動要求使用同一資源,而在同一時間內只有一個活動能使用這一資源,每個活動都有使用這一資源的開始時間si和結束時間fi,且si<fi。目標:要在所給的活動中,找出最大的相容的活動子集合。
性質:每次選擇具有最早完成時間的相容活動加入集合中。
解:
活動安排問題:
與會場安排問題類似
不是需要多個會場,而是使用一個會場,儘可能多的安排活動
則對於活動進行根據結束時間進行排序
依次找出開始時間在上一活動之後的活動,在標記數組中賦值爲 1 。
標記數組中爲 1 則能被安排活動(理解會場安排問題此題更簡單)
#include <stdio.h>
int main()
{
int n;
int *start,*end,*exists;
int i,j,k;
printf("請輸入活動的個數:");
scanf("%d",&n);
start=new int [n];
end=new int [n];
exists=new int [n];
for(i=0;i<n;i++)
exists[i]=0;
printf("請輸入活動的開始時間:");
for(i=0;i<n;i++)
scanf("%d",start+i);
printf("請輸入活動的結束時間:");
for(i=0;i<n;i++)
scanf("%d",end+i);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(end[i]>end[j]){
k=start[i];start[i]=start[j]; start[j]=k;
k=end[i];end[i]=end[j]; end[j]=k;
}
}
}
j=0;
exists[j]=1;
for(i=1;i<n;i++){
if(start[i]>=end[j]){
exists[i]=1;
j=i;
}
}
printf("可以安排的活動是:\n");
for(i=0;i<n;i++){
if(exists[i])
printf("%d ",i);
}
putchar('\n');
return 0;
}