poj 3185 高斯消元 枚举变元

来源:互联网 发布:初中编程学哪个 编辑:程序博客网 时间:2024/06/01 09:14

变元不确定要枚举否则不保证解最优

#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;}
0 0
原创粉丝点击