c++回溯法实现工作分配问题

思路

先初始化一个数组存入1至n;用于选择

1:回溯的边界条件为当前层数增加大于实际需要层数

2:当当前层数小于以下实际层数时

进入递归

递归内容:

1:当前层中使用循环,循环的起点i设为当前层,重点为最终层层数

{循环内

 先交换x中第x[i]和x[当前层];

即x[t]层已经被选择;

然后将花费增加x[当前层][x[当前层]];

递归(层数+1);

递归完成后,返回上节点;

花费减去当前层;

再交换x[t]和x[i];

#include <iostream>
using namespace std;
int x[100];
int n;//人数
int ren[100][100];
int mini=100000;
int cost=0;
void Backgui(int t)
{ if(t>n)
    { if(cost<mini)
            mini=cost;
//        for(int i=1;i<=n;i++)
//        {     cout<<x[i]<<" ";
//        }
//         cout<<cost<<endl   ;
        return;}
     for(int i=t;i<=n;i++)
    {   swap(x[i],x[t]);
         cost+=ren[t][x[t]];
       Backgui(t+1);
       cost-=ren[t][x[t]];
       swap(x[i],x[t]);
     }
}
int main()
{  cin>>n;
    for(int i=1;i<100;i++)
    {    x[i]=i;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {   cin>>ren[i][j];
        }
    }
    Backgui(1);
   cout<<mini;
    return 0;
}

附上代码,没考虑建支

点赞