关闭

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

437人阅读 评论(0) 收藏 举报
分类:

思路

先初始化一个数组存入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;
}

附上代码,没考虑建支

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:956次
    • 积分:14
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档