贪心算法的C语言实现与运用详解
贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。贪心算法的基本思路如下: 1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程: 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解; #include "stdio.h" void main() { int act[11][3]={{1,1,4},{2,3,5},{3,6},{4,5,7},{6,9},{7,6,10},{8,8,11},{9,12},{10,2,13},{11,12,14}}; greedy(act,11); getch(); } int greedy(int *act,int n) { int i,j,no; j=0; printf("Selected activities:/n"); no=0; printf("Act.%2d: Start time %3d,finish time %3d/n",act[no],act[no+1],act[no+2]); for(i=1;i<n;i++) { no=i*3; if(act[no+1]>=act[j*3+2]) { j=i; printf("Act.%2d: Start time %3d,act[no+2]); } } } 例题 题目描述:
定理 ac代码 #include <stdio.h> #include <stdlib.h> #include <string.h> struct join { int begin; int end; }; int compare(const void *a,const void *b); int main() { int i,n,k; struct join joins[1001],temp[1001]; while(scanf("%d",&n) != EOF) { for(i = 0; i < n; i ++) { scanf("%d %d",&joins[i].begin,&joins[i].end); } qsort(joins,sizeof(joins[0]),compare); k = 0; temp[k] = joins[0]; for(i = 1; i < n; i ++) { if(joins[i].begin >= temp[k].end) temp[++ k] = joins[i]; } printf("%dn",k + 1); } return 0; } int compare(const void *a,const void *b) { const struct join *p = a; const struct join *q = b; return p->end - q->end; } /************************************************************** (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |