pilot系列之最基础的穷竭搜索(初级篇)C题意:药药!切克闹! 煎饼果子来一套!有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示)。一次可将同一行或同一列的煎饼全部翻转。现在需要把尽可能多的煎饼翻成正面朝上,问最多能使多少煎饼正面朝上?
输入:多组输入,每组第一行为二整数r, c (1 ≤ r ≤ 10, 1 ≤ c ≤ 10 000),剩下r行c列表示煎饼初始状态。r=c=0表示输入结束。
输入:多组输入,每组第一行为二整数r, c (1 ≤ r ≤ 10, 1 ≤ c ≤ 10 000),剩下r行c列表示煎饼初始状态。r=c=0表示输入结束。
输出:对于每组输入,输出最多能使多少煎饼正面朝上。
就进行每一行的转换,深搜将行的转换的情况全都列出来,在每一种情况的基础下再研究每一列的1的最大值,如果一列1的个数少于0的个数,就将这一列翻过来。将每一种情况的1的个数相比较,取最大的那个数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
bitset<10500> a[50];
int sum;
int r,c;
void dfs(int ans)
{
if(ans==r)
{
int result=0;
for(int j=0;j<c;j++)
{
int number=0;
for(int i=0;i<r;i++)
{
if(a[i][j]) number++;
}
number=max(number,r-number);
result+=number;
}
sum=max(sum,result);
return ;
}
dfs(ans+1);
a[ans].flip();
dfs(ans+1);
a[ans].flip();
}
int main(void)
{
// freopen("C.txt","r",stdin);
// int r,c;
while(scanf("%d%d",&r,&c)!=EOF&&(r||c))
{
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
bool temp;
scanf("%d",&temp);
a[i][j]=temp;
}
}
sum=0;
dfs(0);
printf("%d\n",sum);
}
return 0;
}