参考《计算机算法基础》华中科技大学版
1. 带有限期和收益的单位时间的作业排序贪心算法
/* 带有限期和收益的单位时间的作业排序贪心算法 */ #include <stdio.h> /*算法1,复杂度O(n*n)*/ void JS(int d[], int J[], int n, int &k) { /*终止时,d[J[i]]<=d[J[i+1]]*/ int i,j,r; d[0] = J[0] = 0; k = 1; J[1] = 1; for(i=2; i<=n; i++) { r = k; while(d[J[r]] > d[i] && d[J[r]] != r) r–; if(d[J[r]] <= d[i] && d[i]>r) { for(j=k; j>r; j–) J[i+1] = J[i]; J[r+1] = i; k++; } } } /*算法2,复杂度O(n)*/ void FJS(int d[], int J[], int n, int &k) { int i,j,f[100]; for(i=0; i<=n; i++) { f[i] = i; P[i] = -1; } k = 0; for(i=1; i<=n; i++) { if(n>d[i]) j = d[i]; else j = n; while(f[j]!=j) j = f[j]; if(f[j]!=0) { k++; J[k] = i; f[j] = f[j-1]; } } } void sort(int p[], int d[], int m) { int temp; int i,j,k; for(i=0; i<m; i++) { k = i; for(j=i+1; j<m; j++) if(p[k] < p[j]) k = j; if(k!=i) { temp = p[k]; p[k] = p[i]; p[i] = temp; temp = d[k]; d[k] = d[i]; d[i] = temp; } } } int main() { int p[100]; int d[100]; int J[100]; int n,i,j,k; printf(“请输入作业数:”); scanf(“%d”, &n); printf(“输入作业期限:/n”); for(i=1; i<=n; i++) scanf(“%d”, &d[i]); printf(“输入作业收益:/n”); for(i=1; i<=n; i++) scanf(“%d”, &p[i]); /*使用JS和FJS之前,需要先对p进行排序,使其按非降次序变化*/ sort(p, d, n); k=0; FJS(d, J, n, k); for(i=1; i<=k; i++) printf(“%d-%d-%d “, p[J[i]], d[J[i]], J[i]); getchar(); getchar(); getchar(); return 0; }
2. 背包问题
/* 贪心算法设计的核心是—选择能产生问题最优解的最优量度标准 背包问题 */ #include <stdio.h> void sort(float p[], float w[], int m) { float p_m[100],temp; int i,j,k; for(i=0; i<m; i++) p_m[i] = p[i]/w[i]; for(i=0; i<m; i++) { k = i; for(j=i+1; j<m; j++) if(p_m[k] < p_m[j]) k = j; if(k!=i) { temp = p_m[k]; p_m[k] = p_m[i]; p_m[i] = temp; temp = p[k]; p[k] = p[i]; p[i] = temp; temp = w[k]; w[k] = w[i]; w[i] = temp; } } } int main() { float p[100]; float w[100]; float x[100]; float cu; int i,j,m; cu = 5; printf(“输入物品种类:/n”); scanf(“%d”, &m); printf(“输入物品重量:/n”); for(i=0; i<m; i++) scanf(“%f”, &w[i]); printf(“输入物品收益:/n”); for(i=0; i<m; i++) scanf(“%f”, &p[i]); sort(p, w, m); for(i=0; i<m; i++) x[i] = 0; for(i=0; i<m; i++) { if(w[i] > cu) break; x[i] = 1; cu -= w[i]; } if(i<m) x[i] = cu/w[i]; for(i=0; i<m; i++) printf(“%f-%f=%f “, w[i], p[i], x[i]); getchar(); getchar(); getchar(); return 0; }