Light OJ 1264 Grouping Friends (DP+枚举子集)

来源:互联网 发布:水木年华知乎 编辑:程序博客网 时间:2024/06/10 16:11

题意:将所有人分若干组,使得每组的不满意值的和最小。

解析:预处理出来每个可能的组的不满意值,再枚举一下自己即可。

[code]:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int INF = 0x3f3f3f3f;int n,d[15][15],f[1<<15],dp[1<<15];void sol(){    int i,j,S,Ed = 1<<n,S_;    int ans = INF;    for(S = 1;S < Ed;S++){        f[S] = 0;        for(i = 0;i < n;i++){            if(!(S>>i&1)) continue;            for(j = 0;j < n;j++){                if(i==j||!(S>>j&1)) continue;                f[S] += d[i][j];            }        }    }    for(S = 1;S < Ed;S++){        dp[S] = INF;        for(S_=S;S_!=0;S_ = (S_-1)&S){            dp[S] = min(dp[S],dp[S^S_]+f[S_]);        }    }    printf("%d\n",dp[Ed-1]);}int main(){    int i,j,cas;    scanf("%d",&cas);    for(int T=1;T<=cas;T++){        scanf("%d",&n);        for(i = 0;i < n;i++){            for(j = 0;j < n;j++) scanf("%d",&d[i][j]);        }        printf("Case %d: ",T);        sol();    }    return 0;}


0 0
原创粉丝点击