算法
1. 实践题目 :
工作分配问题
2. 问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
3. 算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[101][101];
int vis[101];
int best1=1000,now=0;
void backtrack(int x)
{
if(x==n)
{
if(best1>now)
best1=now;
return;
}
if(now>best1)
return;
for(int i=0; i<n; i++){
if(!vis[i])
{
now += a[x][i];
vis[i] = true;
backtrack(x+1);
now -= a[x][i];
vis[i] = false;
}
}
}
int main()
{
1. 实践题目 :
工作分配问题
2. 问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
3. 算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[101][101];
int vis[101];
int best1=1000,now=0;
void backtrack(int x)
{
if(x==n)
{
if(best1>now)
best1=now;
return;
}
if(now>best1)
return;
for(int i=0; i<n; i++){
if(!vis[i])
{
now += a[x][i];
vis[i] = true;
backtrack(x+1);
now -= a[x][i];
vis[i] = false;
}
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>a[i][j];
backtrack(0);
cout<<best1<<endl;
return 0;
}
4. 心得体会(对本次实践收获及疑惑进行总结)
我觉得,一次上机实践,效率蛮高的,可以让人收获很多东西,头脑运作快,然后平时的效率高很多,但是还有不少知识点没有熟悉掌握,需要继续努力!
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>a[i][j];
backtrack(0);
cout<<best1<<endl;
return 0;
}
4. 心得体会(对本次实践收获及疑惑进行总结)
我觉得,一次上机实践,效率蛮高的,可以让人收获很多东西,头脑运作快,然后平时的效率高很多,但是还有不少知识点没有熟悉掌握,需要继续努力!