题目的意思是:
有一系列的活动,要求活动的时间不能有冲突。最多可以安排多少节目。
比如目前有11个活动,活动的起始时间与结束时间如下所示:
节目: 1 2 3 4 5 6 7 8 9 10 11
si: 1 3 0 5 3 5 6 8 8 2 12
fi: 4 5 6 7 8 9 10 11 12 13 14
则节目1,4,8,11或者节目2,4,9,11为最多可以安排的节目!
方法一:采用动态规划
参考代码如下:
#include<stdio.h>
const int S[12]={0,1,3,0,5,3,5,6,8,8,2,12};
const int F[12]={0,4,5,6,7,8,9,10,11,12,13,14};
int len=11;
int result[12][14]={0}; // result[0][14]初始化为0
int mark[12][15]={0};
void Pri(int mark[12][15],int i, int j)
{
if(i==0)
{
return;
}
else
{
if(mark[i][j]==2 || mark[i][j]==1)
{
Pri(mark,i-1,j);
}
else if(mark[i][j]==3)
{
Pri(mark,i-1,S[i]);
printf("%d ",i);
}
}
}
int main()
{
int i,j;
int temp1,temp2;
for(i=1;i<=len;i++)
{
for(j=0;j<=14;j++)
{
if(F[i]<=j)
{
temp1=1+result[i-1][S[i]];
temp2=result[i-1][j];
if(temp1>=temp2)
{
result[i][j]=temp1;
mark[i][j]=3;
}
else
{
result[i][j]=temp2;
mark[i][j]=2;
}
}
else
{
result[i][j]=result[i-1][j];
mark[i][j]=1;
}
}
}
printf("%d\n",result[11][14]);
Pri(mark,11,14);
return 0;
}
方法二:采用贪心算法。
将结束时间排序,则最早结束的那个一定在最优解中!(如何证明?)
递归实现:
#include<stdio.h>
const int S[11]={1,3,0,5,3,5,6,8,8,2,12};
const int F[11]={4,5,6,7,8,9,10,11,12,13,14};
int len=11;
int num=0;
void Find(int S[11], int F[11],int i)
{
int m=i+1; //找到下一个起始点
while((m<11)&&(S[m]<F[i]))
{
m++;
}
printf("%d ",i+1);
num++;
if(m<11)
{
Find(S,F,m);
}
else
return;
}
int main()
{
Find(S,F,0);
printf("\n%d\n",num);
return 0;
}
非递归实现:
#include<stdio.h>
const int S[11]={1,3,0,5,3,5,6,8,8,2,12};
const int F[11]={4,5,6,7,8,9,10,11,12,13,14};
int len=11;
int main()
{
int i,j;
int num=0;
i=0;
j=i+1;
while(i<11)
{
printf("%d ",i+1);
num++;
while(j<11 && S[j]<F[i])
{
j++;
}
i=j;
}
printf("\nTotal num is %d\n",num);
return 0;
}