算法第五章上机实践

1.实践题目 :工作分配问题

2.问题描述

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

3.算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)

解空间是一个排列树,用一个二维数组a[i][j]来存工作i分配给第j个人所需的费用cij。

通过if(cost<bcost)来进行剪枝,即未到达叶节点时的费用已经高于目前得到的最小花费时进行剪枝。

#include <iostream>
using namespace std;
int n,b[25],a[25][25];
int bcost=9999,cost=0;
void bt(int i)
{
    if(i>n&&cost<bcost)
        bcost=cost;
    if(cost<bcost)
    {
        for(int j=1;j<=n;j++)
        {
            if(b[j]==0)
            {
                b[j]=1;
                cost+=a[i][j];
                bt(i+1);
                cost-=a[i][j];
                b[j]=0;
            }
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    for(int j=1;j<=n;j++)
        b[j]=0;
    bt(1);
    cout<<bcost;
    return 0;
    
}

 

4.心得体会(对本次实践收获及疑惑进行总结)

确定解空间后,在草稿纸上构造一棵树,按深度优先进行搜索。剪枝是个难点,严格的剪枝函数才能避免超时。

posted @ 2018-12-24 19:56  木屐丶  阅读(90)  评论(0编辑  收藏  举报