算法导论 16.1-1活动选择问题的动态规划算法 答案

来源:互联网 发布:恒扬数据市值 编辑:程序博客网 时间:2024/05/17 08:50
//16.1-1 活动选择问题的动态规划算法#include <stdio.h>#include <stdlib.h>#define N 11void dynamic_activity_selector(int *s,int *f,int c[N+1][N+1],int ret[N+1][N+1]);void trace_route(int ret[N+1][N+1],int i,int j);void dynamic_activity_selector(int *s,int *f,int c[N+1][N+1],int ret[N+1][N+1]){int i,j,k;int temp;//当i>=j时,子问题的解为空,即c[i][j]=0for(j=1;j<=N;j++)for(i=j;i<=N;++i)c[i][j]=0;for(j=2;j<=N;++j)for(i=1;i<j;++i){//寻找k,将问题分解为两个子问题,c[i][k],c[k][j]for(k=i+1;k<j;++k){if(s[k]>=f[i]&&f[k]<=s[j])//判断活动k是否满足兼容性{temp=c[i][k]+c[k][j]+1;    if(temp>c[i][j]){    c[i][j]=temp;    ret[i][j]=k;}}}}}void trace_route(int ret[N+1][N+1],int i,int j){if(i<j){trace_route(ret,i,ret[i][j]);if(ret[i][j]!=0)printf("a%d ",ret[i][j]);}}void main(){    int s[N+1] = {-1,1,3,0,5,3,5,6,8,8,2,12};    int f[N+1] = {-1,4,5,6,7,8,9,10,11,12,13,14};    int c[N+1][N+1]={0};    int ret[N+1][N+1]={0};    int i,j;    dynamic_activity_selector(s,f,c,ret);    printf("c[i][j]的值如下所示:\n");    for(i=1;i<=N;i++)    {        for(j=1;j<=N;j++)            printf("%d ",c[i][j]);        printf("\n");    }    //包括第一个和最后一个元素     printf("最大子集的个数为: %d\n",c[1][N]+2);     printf("ret[i][j]的值如下所示:\n");    for(i=1;i<=N;i++)    {        for(j=1;j<=N;j++)            printf("%d ",ret[i][j]);printf("\n");    }    printf("最大子集为:{ a1 ");   trace_route(ret,1,N);    printf("a%d}\n",N);system("pause");}

原创粉丝点击