您的位置:首页 > 其它

工作分配问题

2010-05-08 11:16 225 查看
代码如下

#include<stdio.h>
int N,x[100],bestx[100],f,bestf;
int matrix[100][100];
int backtrack(int i);
void swap(int *x,int i,int j);
int main()
{
int i,j;
f=0;bestf=1000;
scanf("%d",&N);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
scanf("%d",&matrix[i][j]);
for(i=1;i<=N;i++)
x[i]=i;
backtrack(1);
for(i=1;i<=N;i++)
printf("%d",bestx[i]);
printf("/n%d",bestf);
return 0;
}
int backtrack(int i)
{
int j;
if(i>=N+1)
{
bestf=f;
for(j=1;j<=N;j++)
bestx[j]=x[j];
return 0;
}
for(j=i;j<=N;j++)
{
f+=matrix[i][x[j]];
if(f<bestf) //控制递归的条件,剪枝条件;
{
swap(x,i,j);
backtrack(i+1);
swap(x,i,j);
}
f-=matrix[i][x[j]];
}
return 0;
}

void swap(int *x,int i,int j)
{
int t;
t=x[i];
x[i]=x[j];
x[j]=t;
}

总结:

在做此类全排列回鎙题时,要特别注意在回鎙之前和回鎙之后的状态;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: