light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
        【摘要】 
                    题目链接 
     大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的),然后求怎么安排能使好感度和最大,求出最大值。 
  
    开始试了纯暴力...
    
    
    
    大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的),然后求怎么安排能使好感度和最大,求出最大值。
 
开始试了纯暴力的方法,时间复杂度是n!果断超时
  
   - 
    
     
    
    
     
      #include <iostream>
     
    
- 
    
     
    
    
     
      #include <string.h>
     
    
- 
    
     
    
    
     
      #include <algorithm>
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      using namespace std;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      int vis[17];
     
    
- 
    
     
    
    
     
      int n, ans, sum;
     
    
- 
    
     
    
    
     
      int map[19][19];
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      void dfs(int x)
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
         if (x == n+1)
     
    
- 
    
     
    
    
     
          {
     
    
- 
    
     
    
    
     
              ans = max(ans, sum);
     
    
- 
    
     
    
    
             return;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         for (int i = 1; i <= n; i++)
     
    
- 
    
     
    
    
     
          {
     
    
- 
    
     
    
    
             if (vis[i] == 0)
     
    
- 
    
     
    
    
     
              {
     
    
- 
    
     
    
    
     
                  sum += map[x][i];
     
    
- 
    
     
    
    
     
                  vis[i] = 1;
     
    
- 
    
     
    
    
                 dfs(x+1);
     
    
- 
    
     
    
    
     
                  vis[i] = 0;
     
    
- 
    
     
    
    
     
                  sum -= map[x][i];
     
    
- 
    
     
    
    
     
              }
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
- 
    
     
    
    
     
      int main()
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
         int t;
     
    
- 
    
     
    
    
     
          cin >> t;
     
    
- 
    
     
    
    
         for (int kase = 1; kase <= t; kase++)
     
    
- 
    
     
    
    
     
          {
     
    
- 
    
     
    
    
     
              cin >> n;
     
    
- 
    
     
    
    
             for (int i = 1; i <= n; i++)
     
    
- 
    
     
    
    
                 for (int j = 1; j <= n; j++)
     
    
- 
    
     
    
    
     
                      cin >> map[i][j];
     
    
- 
    
     
    
    
     
              sum = 0;
     
    
- 
    
     
    
    
     
              ans = 0;
     
    
- 
    
     
    
    
             memset(vis, 0, sizeof(vis));
     
    
- 
    
     
    
    
             dfs(1);
     
    
- 
    
     
    
    
     
              cout << "Case " << kase << ": " << ans << endl;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         return 0;
     
    
- 
    
     
    
    
     
      }
     
    
 
  
   - 
    
     
    
    
     
      //2013-06-25-22.05
     
    
- 
    
     
    
    
     
      #include <iostream>
     
    
- 
    
     
    
    
     
      #include <string.h>
     
    
- 
    
     
    
    
     
      #include <algorithm>
     
    
- 
    
     
    
    
     
      #include <stdio.h>
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      using namespace std;
     
    
- 
    
     
    
    
     
      const int maxn = 1<<16;
     
    
- 
    
     
    
    
     
      int vis[17];
     
    
- 
    
     
    
    
     
      int n, ans, sum;
     
    
- 
    
     
    
    
     
      int map[19][19];
     
    
- 
    
     
    
    
     
      int dp[maxn];
     
    
- 
    
     
    
    
     
      int dfs(int x, int d)
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
         if (x == 0)
     
    
- 
    
     
    
    
             return 0;
     
    
- 
    
     
    
    
         if (dp[x])
     
    
- 
    
     
    
    
             return dp[x];
     
    
- 
    
     
    
    
         for (int i = 0; i < n; i++)
     
    
- 
    
     
    
    
     
          {
     
    
- 
    
     
    
    
             if (x&(1<<i))
     
    
- 
    
     
    
    
     
                  dp[x] = max(dfs(x^(1<<i), d-1)+map[i+1][d], dp[x]);
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         return dp[x];
     
    
- 
    
     
    
    
     
      }
     
    
- 
    
     
    
    
     
      int main()
     
    
- 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
         int t;
     
    
- 
    
     
    
    
     
          cin >> t;
     
    
- 
    
     
    
    
         for (int kase = 1; kase <= t; kase++)
     
    
- 
    
     
    
    
     
          {
     
    
- 
    
     
    
    
     
              cin >> n;
     
    
- 
    
     
    
    
             for (int i = 1; i <= n; i++)
     
    
- 
    
     
    
    
                 for (int j = 1; j <= n; j++)
     
    
- 
    
     
    
    
     
                      cin >> map[i][j];
     
    
- 
    
     
    
    
             memset(dp, 0, sizeof(dp));
     
    
- 
    
     
    
    
     
              ans = dfs((1<<n)-1, n);
     
    
- 
    
     
    
    
             printf("Case %d: %d\n", kase, ans);
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         return 0;
     
    
- 
    
     
    
    
     
      }
     
    
 
 
文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。
原文链接:xindoo.blog.csdn.net/article/details/9173949
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)