题目来源:Light OJ 1011 Marriage Ceremonies
题意:n个男生和n个女生配对 给出n*n的矩阵 aij表示男生i选择女生j得到的值 求两两配对后最大可能得到的值
思路:dp[i][s|(1<<j)] = max(dp[i][s|(1<<j)], dp[i-1][s]+a[i][j])
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 17;
const int INF = 999999999;
int dp[maxn][1<<maxn];
int a[maxn][maxn];
int main()
{
int cas = 1;
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &a[i][j]);
memset(dp, 0, sizeof(dp));
int all = 1<<n;
for(int i = 0; i < n; i++)
dp[0][1<<i] = a[0][i];
for(int i = 1; i < n; i++)
{
for(int s = 0; s < all; s++)
{
if(!dp[i-1][s])
continue;
for(int j = 0; j < n; j++)
{
if(s&(1<<j))
continue;
dp[i][s|(1<<j)] = max(dp[i][s|(1<<j)], dp[i-1][s]+a[i][j]);
}
}
}
printf("Case %d: %d\n", cas++, dp[n-1][all-1]);
}
return 0;
}