贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度

发布时间:2020-04-04 07:23:16   来源:文档文库   
字号:

活动安排

public static int greedySelector(int [] s, int [] f, boolean a[])

{//s[]开始时间f[]结束时间

int n=s.length-1;

a[1]=true;

int j=1;

int count=1;

for (int i=2;i<=n;i++)

{if (s[i]>=f[j]) { a[i]=true;j=i;count++;}

else a[i]=false;

}

return count;

}

背包问题

void Knapsack(int n,float M,float v[],float w[],float x[])

{Sort(n,v,w);//以每种物品单位重量的价值Vi/Wi从大到小排序

int i;

for (i=1;i<=n;i++)x[i]=0;

float c=M;

for (i=1;i<=n;i++)

{if (w[i]>c)break;

x[i]=1;

c-=w[i];

}

if (i<=n)x[i]=c/w[i];//允许放入一个物品的一部分

}

最优装载

void Loading(int x[],Type w[], Type c, int n)

{int *t = new int [n+1];//t[i]要存的是w[j]中重量从小到大的数组下标

Sort(w, t, n);//按货箱重量排序

for (int i = 1; i <= n; i++) x[i] = 0;//O(n)

for (int i = 1; i <= n && w[t[i]] <= c; i++)

{x[t[i]] = 1; c -= w[t[i]];}//调整剩余空间

}

单源最短路径Dijiksra

template

void Dijikstra(int n, int v, Type dist[], int prev[], Type **c)

{//c[i][j]表示边(i,j)的权,dist[i]表示当前从源到顶点i的最短特殊路径bool s[maxint];

for(int i= 1;i<=n; i++)

{dist[i]=c[v][i]; s[i]=false;

if(dist[i]==maxint) prev[i]=0;

else prev[i]=v;

}

dist[v]=0 ; s[v]=true;

for(int i=1;i

{int temp = maxint, u = v;

for(int j= 1;j<=n; j++)

if( (!s[j])&&(dist[j]u= j ; temp=dist[j];

s[u]= true;

for(int j= 1;j<=n;j++)

if( (!s[j])&&(c[u][j])

{Type newdist = dist[u]+c[u][j];

if(newdist

}

}//ENDFOR

}//END

找零钱问题

#define NUM4

void main()

{int m[NUM]={25,10,5,1};

int n;//假设n=99

cin>>n;

cout<的找钱方案为:";

for(int i=0;i

while(n>=m[i]&&n>0)

{cout<

n-=m[i];

}

}//END

多机调度

#define N 10

#define M 3

void sort(int t[],int n);

int set_work1(int t[],int n);

int max(int t[],int num);

int min(int t[],int m);

int set_work2(int t[],int n);

static int time[N]={2,8,18,32,50,72,98,128,182,200},s[M]={0,0,0};

void main()

{sort(time,N);

if(M>=N)//作业数小于机器数

cout<

else

cout<

}

void sort(int t[],int n)

{for(int k=0;k用选择法将处理时间从大到小排序

{int j=k;

for (int i=k; i

if (t[i]>t[j])j=i;

{int temp=t[j];t[j]=t[k];t[k]=temp;}

}

}

int max(int t[],int num)//max函数求解处理时间总和最长

{int max=t[0];

for(int i=1;i

if(max

return max;

}

int min(int t[],int m)

{int min=0;//min记录目前处理作业时间和最小的机器号

for(int i=1;i

if(s[min]>s[i]) min=i;

return min;

}

int set_work1(int t[],int n)

{ int m=0;

for(int i=0;i分派作业

s[m++]+=t[i];

return max(s,N);

}

int set_work2(int t[],int n)

{ for(int i=0;i

s[min(s,M)]+=t[i];

return max(s,M);

}

本文来源:https://www.2haoxitong.net/k/doc/b9ed2c85940590c69ec3d5bbfd0a79563c1ed4a8.html

《贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式