第5章上机实践报告

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

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

3.算法描述:

解空间为排列树。

#代码:

#include <iostream>

using namespace std;
const int N = 29;

int Mincost;
int vis[N];
int n;

struct rt{
    int a[N];
}arr[N];

void backsuo(int cnt,int cost){
    if(cnt>=n){
        if(cost<Mincost){
            Mincost=cost;
        }
        return;
    }
    if(cost>Mincost)return;
    //剪枝函数
    for(int i=0;i<n;i++){
        if(vis[i]==0){
            vis[i]=1;
            cost+=arr[cnt].a[i];
            backsuo(cnt+1,cost);
            cost-=arr[cnt].a[i];
            vis[i]=0;
        }
    }
}

int main(){
    Mincost=0x3f3f3f3f;
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&arr[i].a[j]);
        }
    }
    backsuo(0,0);
    cout<<Mincost<<endl;
    return 0;
}

4.心得体会:对回溯法以及剪枝函数了解不够透彻,自己无法做出这道题,还需要多打代码。

 

posted @ 2018-12-21 14:56  速滑  阅读(134)  评论(0)    收藏  举报