ACM PKU 2531 Network Saboteur http://acm.pku.edu.cn/JudgeOnline/problem?id=2531
先找出在一个集合中的所有点再根据标记来求最大值!做了这么久,也实属无奈!!!
#include <iostream>
using namespace std;
int Case;
int num[21][21];
bool flag[21];
int Max = 0;
int solve(int dp,int st)
{
int i, j, k;
if (dp==0)
{
int sum=0;
for (j = 0;j < Case; j++)
{
if (flag[j] == 1)
{
for (k = 0;k < Case; k++)
{
if (flag[k] != 1)
sum +=num[j][k];
}
}
}
if (sum > Max)
Max = sum;
return 0;
}
for (i = st; i < Case; i++)
{
flag[i] = 1;
solve(dp-1, i+1);
flag[i] = 0;
}
return 0;
}
int main ()
{
int i, j;
cin >> Case;
for (i = 0; i < Case; i++)
for (j = 0; j < Case; j++)
scanf("%d",&num[i][j]);
for (i = 1; i <= Case/2; i++)
{
memset(flag,0,sizeof(flag));
solve(i, 0);
}
cout << Max << endl;
return 0;
}
浙公网安备 33010602011771号