贪心算法

最优子结构性质
当一个问题的最优解一定包含其子问题的最优解时,称此问题具有最优子结构性质

在分析问题是否具有最优子结构性质时,通常先设出问题的最优解,给出子问题的解一定是最优的结论。然后,采用反证法证明“子问题的解一定是最优的”结论成立
反证法证明思路:设原问题的最优解导出的子问题的解不是最优的,然后在这个假设下可以构造出比原问题的最优解更好的解,从而导致矛盾

贪心子结构性质
所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得最终的选择方案是全局最优的

 

会场安排问题

选择方案:每次从剩下未安排的会议中选择具有最早结束时间且不会与已安排的回忆重叠的会议来安排

实现:

#include <stdio.h>
#include <stdlib.h>

void Sort(int*E,int n,int*B)
{
int i,j;
int Btemp=B[0];
int Etemp=E[0];
for(i=1;i<n;i++)
{
for(j=i;j>0;j--)
{
if(B[j-1]>B[j])
{
Btemp=B[j-1];
B[j-1]=B[j];
B[j]=Btemp;

Etemp=E[j-1];
E[j-1]=E[j];
E[j]=Etemp;
}
}
}
}
int* GreedySelector(int n,int*B,int*E,int*A)
{
//E中元素按非减序排列,B中元素做相应调整
int iin,jin;
int *Ain=A;
int *Bin=B;
int *Ein=E;
//初始化选择会议的集合A,即只包含会议1;
Ain[0]=1;
//从会议i开始寻找与会议j相容的会议
jin=1;iin=2;
while(iin<=n)
{
if(Bin[iin]>=Ein[jin])
{
Ain[iin]=1;jin=iin;
}
else
{

Ain[iin]=0;
}
iin++;
}
return Ain;
}

int main()
{
int i;

int*A;
int*B;
int*E;
int n;
int time;

printf("请输入要排序的会议");
scanf("%d",&n);

//初始化A数组,B数组,E数组
B=(int*)malloc(sizeof(int)*n);
E=(int*)malloc(sizeof(int)*n);
A=(int*)malloc(sizeof(int)*n);

for(i=0;i<n;i++)
{
A[i]=0;
printf("请输入第%d个会议的开始时间",i);
scanf("%d",&time);
B[i]=time;
printf("请输入第%d个会议的结束时间",i);
scanf("%d",&time);
E[i]=time;
}
printf("排序前B\n");
for(i=0;i<n;i++)
{
printf("%d ",B[i]);

//printf("%c %d %d",A[i],B[i],E[i]);
}
printf("\n");
printf("排序前E\n");
for(i=0;i<n;i++)
{
//printf("%d",B[i]);
printf("%d ",E[i]);
//printf("%c %d %d",A[i],B[i],E[i]);
}
printf("\n");
Sort(B,n,E);
printf("排序后B\n");
for(i=0;i<n;i++)
{
printf("%d ",B[i]);

//printf("%c %d %d",A[i],B[i],E[i]);
}
printf("\n");
printf("排序后E\n");
for(i=0;i<n;i++)
{
//printf("%d",B[i]);
printf("%d ",E[i]);
//printf("%c %d %d",A[i],B[i],E[i]);
}
printf("\n");
A= GreedySelector(n,B,E,A);
for(i=0;i<n;i++)
{
if(A[i]==1)
{
printf("%d ",i);
}
}


//}
//测试程序
/*for(i=0;i<n;i++)
{
printf("%d",B[i]);
printf("%c %d %d",A[i],B[i],E[i]);
}*/
return 0;


}

posted @ 2012-09-25 13:20  zhouqian7890  阅读(143)  评论(0编辑  收藏  举报