您的位置:首页 > 其它

poj 3185 高斯消元 枚举变元

2016-08-12 00:17 351 查看
变元不确定要枚举否则不保证解最优

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int a[25][25],va[25],ans[25] = {0},cnt;
void dfs(int pre)
{
if(pre==20)
{
int pre3 = 0,pre4 = 0;
for(int i=0;i<20;i++)pre4+=ans[i];
for(int i=0;i<20;i++)
{
int pre2 = 0;
for(int j=0;j<20;j++)
if(j!=i&&ans[j]&&a[i][j])pre2^=1;
pre3+=(a[i][20]^pre2);
}
//printf("%d %d\n",pre3,pre4);
cnt = min(cnt,pre3+pre4);
return ;
}
ans[pre] = 1;
dfs(pre+1);
ans[pre] = 0;
dfs(pre+1);
}
int gaos(int n)
{
int i,j;
for(i=0,j=0;j<n&&i<n;j++)
{
int k;
for(k=i;k<n;k++)
if(a[k][j])break;
if(a[k][j])
{
for(int r=0;r<=n;r++)swap(a[i][r],a[k][r]);
for(int k=0;k<n;k++)
if(k!=i&&a[k][j])
for(int r=j;r<=n;r++)
a[k][r]^=a[i][r];
i++;
}
}
cnt = 1000;
dfs(i);
return cnt;
}
int main()
{
memset(a,0,sizeof(a));
for(int i=0;i<20;i++)scanf("%d",&va[i]);
for(int i=0;i<20;i++)
{
a[i][20] = va[i];
for(int j=-1;j<=1;j++)
if(i+j>=0&&i+j<20)
a[i+j][i] = 1;
}
printf("%d\n",gaos(20));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: