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