算法第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;
}

四、心得体会

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

转载于:https://www.cnblogs.com/wanna-acm/p/10165359.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值