算法第5章上机实践报告

一、实践题目:工作分配问题

二、问题描述:

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

三、算法描述:

(1)解题思路:以第一份工作为结点构造子集树,在Backtrack函数中进行深度搜索。如果sum > bestp,则该分支不满足条件,需要进行剪枝,而后回溯;如果满足sum < bestp,则继续深搜,直至叶节点;如果sum < bestp 且 已搜索至根节点时,则再次得到更优解。在整棵子集树遍历完毕后,最终得到问题的最优解。

(2)代码

#include <iostream>
using namespace std;

int c[25][25];
int n,bestp=0,cp;
int x[25];

void Backtrack(int t){
    if(t>n){
        if(cp<bestp||bestp==0){
            bestp=cp;
        }
        return;
    }
    for(int i=t;i<=n;i++){
        if(bestp!=0&&cp>bestp) continue;
        swap(x[i],x[t]);
        cp += c[t][x[t]];
        Backtrack(t+1);
        cp -= c[t][x[t]];
        swap(x[i],x[t]);
    }      
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>c[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        x[i]=i;
    }
    Backtrack(1);
    cout<<bestp<<endl;
    return 0;
}

四、心得体会

本次的题目有点类似与旅行售货员问题,所以这道题时,我采用了相同的解法,同时这道题也加深了我对回溯法的理解。

posted @ 2018-12-23 19:54  cc-wanna  阅读(178)  评论(0编辑  收藏  举报