回溯6--选择工作
一、心得
二、题目及分析
三、代码及结果
1 #include <iostream>
2 using namespace std;
3 //原数据数组
4 int data[6][6]={{0,0,0,0,0,0},{0,13,11,10,4,7},{0,13,10,10,8,5},{0,5,9,7,7,4},{0,15,12,10,11,5},{0,10,11,8,8,4}};
5 //标记数组,遍历人,标记工作是否被做
6 bool vis[6];
7 //结果数组
8 int ans[6];//用来存哪个人做的哪项工作
9 //找最大值
10 int maxx=0;
11 int ansx[6];
12
13 void print(){
14 cout<<maxx<<endl;
15 for(int i=1;i<=5;i++){
16 cout<<ansx[i]<<" ";
17 }
18 cout<<endl;
19 }
20
21 void search(int step,int sum){
22 if(step==6) return;
23 else
24 for(int i=1;i<=5;i++){//每个人选工作
25 if(!vis[i]){
26 sum+=data[step][i],vis[i]=true,ans[step]=i;
27 if(sum>maxx){
28 maxx=sum;
29 for(int j=1;j<=5;j++){
30 ansx[j]=ans[j];
31 }
32 }
33 search(step+1,sum);
34 vis[i]=false,sum-=data[step][i];
35 }
36 }
37 }
38
39 int main(){
40 search(1,0);
41 print();
42 return 0;
43 }