算法

 

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. 心得体会(对本次实践收获及疑惑进行总结)

我觉得,一次上机实践,效率蛮高的,可以让人收获很多东西,头脑运作快,然后平时的效率高很多,但是还有不少知识点没有熟悉掌握,需要继续努力!

 

posted @ 2018-12-25 00:00  北南xxx极光  阅读(129)  评论(0编辑  收藏  举报