当前位置:文档之家› 贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度

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

活动安排
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[], T ype w[], T ype 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<class Type>
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<n;i++)
{ int temp = maxint, u = v;
for(int j= 1;j<=n; j++)
if( (!s[j])&&(dist[j]<temp) ){u= j ; temp=dist[j]; }s[u]= true;
for(int j= 1;j<=n;j++)
if( (!s[j])&&(c[u][j])<maxint)
{ Type newdist = dist[u]+c[u][j];
if(newdist<dist[j]) {dist[j]= newdist; prev[j]=u; } }
}//ENDFOR
}//END
找零钱问题
#define NUM 4
void main()
{ int m[NUM]={25,10,5,1};
int n; //假设n=99
cin>>n;
cout<<n<<"的找钱方案为:";
for(int i=0;i<NUM;i++)
while(n>=m[i]&&n>0)
{cout<<m[i]<<" ";
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<<set_work1(time,N)<<endl;
else
cout<<set_work2(time,N)<<endl;
}
void sort(int t[],int n)
{for(int k=0;k<n-1;k++) //用选择法将处理时间从大到小排序{int j=k;
for (int i=k; i<n; 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<num;i++)
if(max<t[i]) max=t[i];
return max;
}
int min(int t[],int m)
{int min=0; //min记录目前处理作业时间和最小的机器号for(int i=1;i<m;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<n;i++) //分派作业
s[m++]+=t[i];
return max(s,N);
}
int set_work2(int t[],int n)
{ for(int i=0;i<n;i++)
s[min(s,M)]+=t[i];
return max(s,M);
}。

相关主题