1.基本思想
用回朔法,从第一任务开始,不停去寻找费用最少的组合,如果找到,则将结果保存,如果一条路行不通,则回到上一任务重新寻找。
3.程序清单与注释:
#include
#include
#include
#include
#include
#define M 100
int cost_table[M][M];
unsigned int mincost = 65535;
int task[M],result[M],worker[M];
int n;
void assigned(int task_num,unsigned int cost)
{
int i;
if(task_num>=n && cost {
mincost = cost;
for(i=0;i }
else
{
for(i=0;i if (worker[i]==0 && (cost+cost_table[task_num][i]
{
worker[i]=1;task[task_num]= i;
assigned( task_num+1,cost+cost_table[task_num][i]);
worker[i]=0;task[task_num] = 0;
}
}
}
int chartoint(char data)
{
int i=-1;
switch(data)
{
case '0': i=0; break;
case '1': i=1; break;
case '2': i=2; break;
case '3': i=3; break;
case '4': i=4; break;
case '5': i=5; break;
case '6': i=6; break;
case '7': i=7; break;
case '8': i=8; break;
case '9': i=9; break;
default: i=-1;break;
}
return i;
}
int tranfer_data(char str[],int n)
{
int data=0;
int i,j;
if (n>0)
{
for(i=n;i>0;i--)
{
j=chartoint(str[i]);
data=data+j*pow(10,n-i);
}
}
else
data=-1;
return data;
}
int input_num(void)
{
int result,n,j;
char str[4],ct;
result=1;
while(result>0)
{
n=0;
j=1;
while((ct=getchar())!='\n')
{
str[j]=ct;
j++;
n++;
}
if(n>2)
{
printf("输入错误,请重新输入\n");
result=1;
}
else
{
for(j=1;j {
if(isdigit(str[j]))
result=0;
else
{
printf("输入错误,请重新输入\n");
result=1;
j=n;
}
}
}
}
return tranfer_data(str,n);
}
void main()
{
int i,j;
printf("请输入任务的总数,最大不超过99\n");
n=input_num();
for(i=0;i {
{
worker[i]=0;task[i]=0;result[i]=0;
for(j=0;j {
printf("请输入%d个人,做第%d项目的费用(最大不超过99):\n",i+1,j+1);
cost_table[i][j]=input_num();
}
}
}
assigned(0,0);
printf(" 最小费用为%d \n",mincost);
for(i=0;i printf("第%d项目分配给%d个人完成 \n",i+1,result[i]+1);
}