问答题

【说明】 假设需要将N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配 1个不同的任务。 程序中,N个任务从0开始依次编号,N个工人也从。开始依次编号,主要的变量说明如下。 · c[i][j]:将任务i分配给工人j的费用。 · task[i]:值为0表示任务i未分配,值为j表示任务i分配给工人j。 · worker[k]:值为0表示工人k未分配任务,值为1表示工人k已分配任务。 · mincost:最小总费用。 【C程序】 #include<stdio.h> #define N 8 /*N 表示任务数和工人数*/ int c[N][N]; unsigned int mincost=65535; /*设置的初始值,大于可能的费用*/ int task[N], temp[N], worker[N]; void plan(int k, unsigned int cost) { int i; if( (1) && cost<mincost){ mincost=cost; for(i=0; i<N; i++)temp[i]=task[i]; }else{ for(i=0; i<N;i++)/*分配任务 k*/ if(worker[i]==0 && (2) ){ worker[i]=1; task[k]= (3) ; plan( (4) ,cost+c[k][i]); (5) ; task[k]=0; }/*if*/ } }/*Plan*/ void main() { int i,j; for(i=0; i<N; i++){ /*设置每个任务由不同工人承担时的费用及全局数组的初值*/ worker[i]=0; task[i]=0; temp[i]=0; for(j=0; j<N; j++) scanf(%d",&c[i][j]); } plan(0,0);/*从任务0开始分配*/ printf("\n最小差用=%d\n", mincost); for(i=0;i<N;i++) printf("Task%d is assigned to Worker%d\n",i,temp[i]); }/*main*/

【参考答案】

(1) k==N或k>=N (2) cose+c[k][i]<mincost (3) i (4) k+1 (5) wo......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【说明】设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如是这样,从站点x至站点y的最少上车次数便对应图G中从点x至点y的最短路径长度。而程序要求的换车次数就是上车次数减1。【函数5-9】#include <stdio.h>#define M 20#define N 50int a[N+1]; *用于存放一条线路上的各站编号* iht g[N][N]; *存储对应的邻接矩阵* int dist[N]; *存储站0到各站的最短路径* int m,n;void buildG(){int i,j,k,sc,dd;printf ( 输入公交线路数,公交站数 n );scanf( %d%d , &m, &n);for(i=0; i<n; i++) *邻接矩阵清0* for(j = 0; j < n; j++)g[i][j] = 0;for(i=0; i<m; i++){printf( 沿第%d条公交车线路前进方向的各站编号(O<=编号<=%d,-1结束): n ,i+1, n-1);sc=0; * 当前线路站计数器 * while(1){scanf( %d ,&dd);if(dd==-1)break;if(dd>=0 && dd<n) (1) ;}a[sc]=-1;for(k=1;a[k]>=0; k++) * 处理第i+1条公交线路 * for(j=0; j<k; j++)g (2) =1;}}int minLen(){int j, k;for(j=0;j<n;j++)dist[j]=g[0][j];dist[0]=1;do{for(k=-1,j=0;j<n;j++) * 找下一个最少上车次数的站* if(dist[j]>0&&(k==-1 || dist[j]<dist[k]))k=j;if (k<0 || k==n-1) break;dist[k]=-dist[k]; * 设置k站已求得上车次数的标记 * for(j=1;j<n;j++) * 调整经过k站能到达的其余各站的上车次数 * if ( (3) && (dist[j]==0 || -dist[k]+1<dist[j]))dist[j]= (4) ;}while(1);j=dist[n-1];return (5) ;}void main(){int t;buildG();if((t=minLen()<0)printf( 无解! n );else pdnff( 从0号站到%d站需换车%d次 n”,n-1,t);}