zoukankan      html  css  js  c++  java
  • 软件设计师2005年5月下午试题4(C语言)

    [说明]
      假设需要将N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配1个不同的任务。
      程序中,N个任务从0开始依次编号,N个工人也从0开始依次编号,主要的变量说明如下:
      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(k==N && 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 && cost+c[k][i]<mincost){
         worker[i]=1;task[k]=i;
         Plan( k+1,cost+c[k][i]);
         worker[i]=0; task[k] = 0;
        }/*if*/
       }
      }/*Plan*/

      void main()
      { int i,j;
      for(i=o;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% is assigned to Worker%d\n",i,temp[i]);
      }   

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2091637.html
Copyright © 2011-2022 走看看