zoukankan      html  css  js  c++  java
  • [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]);
        }
    }
  • 相关阅读:
    程序的循环结构
    异常处理
    java中多态的使用
    java中String类型的相关知识
    java中类与对象
    java中部分知识点的验证实现
    java 中递归的实现 以及利用递归方法实现汉诺塔
    java 枚举类型和数据二进制等问题思考
    简单的java程序通过对话框输出 计算加减乘除运算(运算方法可选择)
    大道至简第二章读后感
  • 原文地址:https://www.cnblogs.com/hcbin/p/1669578.html
Copyright © 2011-2022 走看看