LightOJ 1011 - Marriage Ceremonies

来源:互联网 发布:淘宝满减凑单再退款 编辑:程序博客网 时间:2024/05/16 12:22

题意:对于给定的n个man 和n个woman ,给出每对之间的欣赏度,让你来配对,使得n对之间的欣赏度和最高 (n<=16)

题目链接

状态压缩+记忆化搜索


#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;#define maxn 16int n;int dp[1<<maxn];int a[20][20];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)+a[i+1][d],dp[x]);    }    return dp[x];}int main(){    int T;    while(~scanf("%d",&T)){        for(int ncase=1;ncase<=T;ncase++){            scanf("%d",&n);            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)                    scanf("%d",&a[i][j]);            memset(dp,0,sizeof(dp));            int ans=dfs((1<<n)-1,n);            printf("Case %d: %d\n",ncase,ans);        }    }    return 0;}

原创粉丝点击