本題難度:難
本題佔分比例:5%
所謂相似度矩陣是一個n*n的二維數組like[i][j]。其中i,j分別爲女人的編號和學生的編號,皆從0到n-1編號。like[i][j]是一個0到100的整數值,表示第i個女人和第j個學生的相似度,值越大相似度越大,比如0表示完全不相似,100表示百分之百一樣。每個女人都需要找一個自己代替的女學生。
最終要使兩邊一一配對,形成一個匹配。請編程找到一種匹配方案,使各對女人和女學生之間的相似度之和最大。
接下來n行給出相似度,每行n個0到100的整數,依次對應二維矩陣的n行n列。
97 91 68 14
8 33 27 92
36 32 98 53
73 7 17 82
對於100%的數據,n<=13
#include<iostream>
using namespace std;
int mat[13][13],vis[13];//vis[i]=1表示已經選定
int ans=0,n;
void dfs(int cur,int sum)//cur表示當前已經選定的人數,sum表示相似度的和
{
if(cur==n)
{
ans=max(sum,ans);
return;
}
for(int i=0;i<n;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(cur+1,sum+mat[cur][i]);
vis[i]=0;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>mat[i][j];
dfs(0,0);
cout<<ans;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int like[13][13], n;
int d[14][(1 << 13) - 1];
void dp()
{
int i, j, k, t;
for (i = 0;i<n;i++)
for (j = 1;j<1 << n;j++)
{
int c = 0;
for (k = 0;k<n;k++)
if (j&(1 << k))
c++;
if (c != i + 1) continue;
if (i == 0)
{
for (t = 0;t<n;t++)
if (j&(1 << t))
d[i][j] = like[i][t];
}
else
for (t = 0;t<n;t++)
if (j&(1 << t))
{
int s = (~(1 << t))&j;
d[i][j] = max(d[i][j], d[i - 1][s] + like[i][t]);
}
}
}
int main()
{
cin >> n;
for (int i = 0;i<n;i++)
for (int j = 0;j<n;j++)
cin >> like[i][j];
dp();
cout << d[n - 1][(1 << n) - 1];
return 0;
}