• [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:最小总费用.
    */

    #include 
    <stdio.h>
    #include 
    <stdlib.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>=&& 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]){
                    worker[i] 
    = 1; task[k] = i;
                    Plan(k
    +1,cost+c[k][i]);
                    worker[i] 
    = 0; task[k] = 0;
                }
            }
        }
    }

    void main(){
        
    int i,j;
        srand(
    10000);
        
    for(j=0;j<N;j++){
            
    if(j==0){printf("\t");}
            printf(
    "工人%d\t",j);
        }
        printf(
    "\n");
        
    for(i=0;i<N;i++){
            
    //设置每个人任务由不同工人承担时的费用及全局数组的初值
            worker[i] = 0;
            task[i]   
    = 0;
            temp[i]   
    = 0;
            printf(
    "任务%d:\t",i);
            
    for(j=0;j<N;j++){
                
    //scanf("%d",&c[i][j]);
                c[i][j] = rand();
                printf(
    "%d",c[i][j]);
                
    if(j<N-1){printf(",\t");}
            }
            printf(
    "\n");
        }
        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]);
        }
        system(
    "pause");
    }

    原来的代码:

    #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>=&& 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]){
                    worker[i] 
    = 1; task[k] = i;
                    Plan(k
    +1,cost+c[k][i]);
                    worker[i] 
    = 0; task[k] = 0;
                }
            }
        }
    }

    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]);
        }
    }
  • 相关阅读:
    2017微软骇客马拉松精彩大回Fun:不一样的Hacker,一Young的Cool
    老板这种生物:只看结果,不问过程
    小目标 | 分解任务,聪明人只设达得到的“小目标”
    本号讯 | 微软被 Forrester 评为销售服务自动化解决方案领导者
    IT圈网红,抢鲜围观
    云时代“非诚勿扰”
    安装conda后去除终端出现的(base)字样
    Ubuntu18.04 安装 Anaconda3
    高斯模糊
    准确率(Accuracy) 精确率(Precision) 与 召回率(Recall)
  • 原文地址:https://www.cnblogs.com/hcbin/p/1669578.html
Copyright © 2020-2023  润新知