标签:深度 namespace int tin span continue void iostream std
一、实践题目:工作分配问题
二、问题描述:
设有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; }
四、心得体会
本次的题目有点类似与旅行售货员问题,所以这道题时,我采用了相同的解法,同时这道题也加深了我对回溯法的理解。
标签:深度 namespace int tin span continue void iostream std
原文地址:https://www.cnblogs.com/wanna-acm/p/10165359.html