p1177

  真的是挺简单的,按照要求直接搜。虽然我不知道到底是横行表示工作还是竖列,但是搜起来还是一样的。

  

 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 }
p1177

  然后之所以迟迟不行的原因其实是我习惯把循环变量弄成全局的。而在这道题中,dfs内部的变量是不能被自己的下层变来变去的。然后就只能过一些个特殊情况。

  还有一个小小的害怕:如果出题人给了个所有工作时间都一样的数据岂不是要爆炸,即使优化if(sum>=ans)return ;后复杂度还是n的n次方,简直了。

原文地址:https://www.cnblogs.com/qywyt/p/8979586.html