POJ 2133

类似于DP一样做,但这题有个大坑,自己看DIS吧。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#define LL __int64
using namespace std;

const int N=1<<16;
const int inf=1<<30;
int dp[N];
char str[25];
int ans[25];
int num[125],b,n,goal;

int judge(int f,int s){
	int tmp;int c=0;
	for(int k=0;k<b;k++){
		tmp=1<<k;
		if((f&tmp)==(s&tmp))
		c++;
	}
	return c;
}

int main(){
	while(scanf("%d%d",&b,&n)!=EOF){
		scanf("%s",str+1);
		goal=0;
		int len=strlen(str+1);
		for(int i=len;i>=1;i--){
			int t=str[i]-'0';
			goal+=t*(1<<(b-i));
		}
		int tmp=(1<<b)-1;;
		for(int k=1;k<=n;k++){
			scanf("%s",str+1);
			len=strlen(str+1);
			num[k]=0;
			for(int i=len;i>=1;i--){
				int t=str[i]-'0';
				num[k]+=t*(1<<(b-i));
			}
		}
		bool flag=false;
		for(int k=1;k<=n;k++){
			if(num[k]==goal){
				len=0;
				if(goal==0){
					printf("1\n");
					int pos=goal;
					while(b--){
						ans[++len]=pos%2;
						pos>>=1;
					}
					for(int i=len;i>0;i--)
					printf("%d",ans[i]);
					printf("\n");
					flag=true;
					break;
				}
				else if(goal!=0){
					printf("2\n");
					int pos=goal;
					while(b--){
						ans[++len]=pos%2;
						pos>>=1;
					}
					for(int i=len;i>0;i--)
					printf("%d",ans[i]);
					printf("\n");
					flag=true;
					break;
				}
			}
		}
		if(flag) continue;
		for(int k=0;k<=tmp;k++){
			dp[k]=inf;
		}
		for(int i=1;i<=n;i++)
		dp[num[i]]=0;
		for(int i=1;i<=n;i++){
			for(int k=0;k<=tmp;k++){
				dp[k]=min(dp[k],dp[k^num[i]]+1);
			}
		}
		int pos=-1,c=-1,t;
		for(int k=0;k<=tmp;k++){
			if(dp[k]!=inf){
				t=judge(k,goal);
				if(t>c){
					pos=k;
					c=t;
				}
				else if(t==c){
					if(dp[pos]>dp[k])
					pos=k;
				}
			}
		}
		printf("%d\n",dp[pos]);
		len=0;
		while(b--){
			ans[++len]=pos%2;
			pos>>=1;
		}
		for(int i=len;i>0;i--)
		printf("%d",ans[i]);
		printf("\n");
	}
	return 0;
}
	

  

posted @ 2015-02-17 08:45  chenjunjie1994  阅读(139)  评论(0编辑  收藏  举报