真的是挺简单的,按照要求直接搜。虽然我不知道到底是横行表示工作还是竖列,但是搜起来还是一样的。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 int i,f,n,o[30][30],ans=200000; 8 bool flag[30]; 9 void dfs(int sum,int now) 10 { 11 if(sum>=ans) return ; 12 if(now==n) 13 { 14 ans=sum; 15 return ; 16 } 17 now++; 18 for(int j=1;j<=n;j++) 19 { 20 if(flag[j]==0) 21 { 22 flag[j]=1; 23 dfs(sum+o[j][now],now); 24 flag[j]=0; 25 } 26 } 27 return; 28 } 29 int main() 30 { 31 ios::sync_with_stdio(false); 32 cin>>n; 33 for(i=1;i<=n;i++) 34 for(f=1;f<=n;f++) 35 cin>>o[i][f]; 36 for(i=1;i<=n;i++) 37 { 38 flag[i]=1; 39 dfs(o[i][1],1); 40 flag[i]=0; 41 } 42 cout<<ans; 43 }
然后之所以迟迟不行的原因其实是我习惯把循环变量弄成全局的。而在这道题中,dfs内部的变量是不能被自己的下层变来变去的。然后就只能过一些个特殊情况。
还有一个小小的害怕:如果出题人给了个所有工作时间都一样的数据岂不是要爆炸,即使优化if(sum>=ans)return ;后复杂度还是n的n次方,简直了。