zoukankan      html  css  js  c++  java
  • 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次方,简直了。

  • 相关阅读:
    7.12.2
    7.12.1
    7.11.8
    循环测试条件前缀和后缀的区别
    7.11.7 两个版本
    7.11.5
    7.12 vowels.c 程序
    7.11 animals.c 程序
    7.6.2 break 语句
    7.10 break.c 程序
  • 原文地址:https://www.cnblogs.com/qywyt/p/8979586.html
Copyright © 2011-2022 走看看