USACO 2.1.4 Healthy Hosteins

来源:互联网 发布:php接收图片上传 编辑:程序博客网 时间:2024/05/17 16:00

WA,TLE了九次- -

苯渣会说一开始我都是用DFS,BFS,排序后剪枝的DFS,排序后剪枝的BFS……

但这不是有序的排列问题(1,2,3和1,3,2等价)!所以DFS,BFS就平白无故 多出平均n!/1.5倍时间了难过

解决之道是用二进制表示子集。因为只有十五种药品,所以子集表示数0~32767.

【注意区分排列和子集问题】

/*ID:szwjcch971LANG:C++TASK:holstein*/#include "stdio.h"#include "string.h"int pw2[16]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};int top=0,stack[20];int main(){FILE *fin=fopen("holstein.in","r");FILE *fout=fopen("holstein.out","w");int n,i,j,g,k,temp1,temp2,I,min_ones=999,min_number=99999,count_ones;int goal[25],feed[15][25],status[25];fscanf(fin,"%d",&n);for(i=0;i<n;i++)fscanf(fin,"%d",&goal[i]);fscanf(fin,"%d",&g);for(i=0;i<g;i++){for(j=0;j<n;j++){fscanf(fin,"%d",&feed[i][j]);}}memset(stack,0,sizeof(stack));for(i=0;i<pw2[g];i++){memset(status,0,sizeof(status));count_ones=j=0;k=i;while(k){temp1=k&1;k=k>>1;if(temp1){count_ones++;for(I=0;I<n;I++){status[I]+=feed[j][I];}}j++;}temp2=1;for(I=0;I<n;I++)if(status[I]<goal[I]){temp2=0;break;}if(temp2){if(min_ones>count_ones){min_ones=count_ones;min_number=i;}if(min_ones==count_ones){if(min_number>i)min_number=i;}}}fprintf(fout,"%d ",min_ones);temp1=0;for(i=0;i<16;i++){if(min_number&pw2[i]){temp1++;fprintf(fout,"%d",i+1);if(temp1!=min_ones)fprintf(fout," ");}}fprintf(fout,"\n");return 0;}


0 0