回溯6--选择工作

回溯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 }

原文地址:https://www.cnblogs.com/Renyi-Fan/p/7124158.html