思路
先初始化一个数组存入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;
}
附上代码,没考虑建支