[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]);
    }
}

 

posted @ 2010-02-24 20:07  炎峰森林影  阅读(570)  评论(0编辑  收藏  举报