Uva1377
/* 在n个刻度和他们的差里挑不超过7个刻度,0是固定的,最大的刻度肯定是最大值,然后剩下的dfs挑。 */ #include<bits/stdc++.h> #define inf 0x3f3f3f3f const int maxn=1000000; using namespace std; int n,m,h,maxx,minx,icase,tar_size,a[100+10],ans[100+10],tar[100+10],flag[maxn+10]; int b[100+10]; int fla[maxn+10],fla1[maxn+10]; int add(int x,int siz){ int cnt=0; for(int i=0;i<siz;i++){ if(fla1[abs(a[i]-x)]){ fla[abs(a[i]-x)]++; if(fla[abs(a[i]-x)]==1) cnt++; } // if(fla1[x]&&a[i]!=0) { // fla[x]++; // if(fla[x]==1) cnt++; // } } return cnt; } void dele(int x,int siz){ //int cnt=0; for(int i=0;i<siz;i++){ if(fla1[abs(a[i]-x)]){ // if(fla[abs(a[i]-x)]>=1) fla[abs(a[i]-x)]--; } //if(fla1[x]&&a[i]!=0) fla[x]--; } //printf("%d\n",cnt); } void dfs(int now,int res,int index){ //printf("%d\n",res); if(now>=7&&res<tar_size) return ; if(now<=7&&res==tar_size){ //printf("0 "); //for(int i=0;i<now;i++) //printf("%d ",a[i]); //printf("\n"); //set<int>::iterator it=fla.begin(); //for(;it!=fla.end();++it){ // printf("%d ",*it); //} // printf("\n"); //printf("%d %d %d\n\n",now,tar_size,res); if(minx>now) { minx=now; for(int i=0;i<now;i++) ans[i]=a[i]; } return ; } for(int i=index;i<h;i++){ //a[now]=tar[i]; //if(tar[i]==maxx||tar[i]==0) continue; int s=add(tar[i],now); if(!s) {dele(tar[i],now);continue;} a[now]=tar[i]; //printf("%d %d\n",res+1,fla.size()); //int s=fla.size(); // s=(add(tar[i],now)-s); //printf("%d\n",s); //if(!s) continue; dfs(now+1,res+s,i+1); dele(tar[i],now); } } int main() { while(scanf("%d",&n)!=EOF&&n){ printf("Case %d:\n",++icase); minx=inf,maxx=0,memset(a,0,sizeof(a)),memset(tar,0,sizeof(tar)),memset(flag,0,sizeof(flag)); memset(b,0,sizeof(b)),memset(fla,0,sizeof(fla)),memset(fla1,0,sizeof(fla1)); h=0; int q=0; for(int i=0;i<n;i++) { scanf("%d",&m); if(!flag[m]) tar[h++]=m,b[q++]=m,flag[m]=1,fla1[m]=1; maxx=max(maxx,m); } sort(tar,tar+h); sort(b,b+h); //for(int i=0;i<h;i++) printf("%d\n",b[i]); tar_size=h; for(int i=0;i<tar_size;i++){ for(int j=i+1;j<tar_size;j++){ if(!flag[tar[j]-tar[i]]) tar[h++]=tar[j]-tar[i],flag[tar[j]-tar[i]]=1; } } //printf("%d %d\n",tar_size,h); sort(tar,tar+h); //for(int i=0;i<h;i++) printf("%d\n",tar[i]); //printf("%d\n",fla.size()); a[0]=0; fla[0]=1; dfs(1,0,0); sort(ans,ans+minx); printf("%d\n",minx); // printf("0"); for(int i=0;i<minx;i++) { //if(ans[i]!=maxx&&ans[i]!=0) if(!i) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); //printf(" %d\n",maxx); } return 0; }