#include <stdio.h> #include <stdlib.h> #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b #define MAXA 4 #define MAXN 100 int stamp[MAXN], ans[2][MAXA], ans_num[4][MAXA], sign,begin_id, pre_begin=-1, all, f_kind, rank_num; void rank_can(const int kind, const int total,const int require); void stamp_min() { int cnt=0,pre_value=-1; for(int i=0; i<all; ++i) { if(pre_value!=stamp[i]) { if(cnt>5) { for(int j=i; j<all; ++j) {stamp[j-cnt+5]=stamp[j]; } all-=cnt-5; } cnt=1; pre_value=stamp[i]; } else ++cnt; } } int cmp(const void* a, const void* b) { return *(int*)b-*(int*)a; } void DFS(const int kind,const int total,const int start, const int require, int now_k, int now_to) { if(now_k==kind) { if((now_to+ans[1][kind-1]*(total-kind))>require) return; else if((now_to+ans[1][0]*(total-kind))<require) return; else { rank_can(kind,total,require); if(rank_num>1&&(pre_begin==-1||pre_begin!=-1&&stamp[pre_begin]==stamp[begin_id])) { sign=4; return; } if(rank_num==1&&pre_begin==-1) { ++sign; if(pre_begin==-1) { pre_begin=begin_id; for(int i=0; i<4; ++i) ans[0][i]=ans[1][i]; } } } return; } for(int i=start; i<all; ++i) { if(!now_k) begin_id=i; ans[1][now_k]=stamp[i]; if(require<now_to+stamp[i]) continue; DFS(kind,total,i+1,require,now_k+1,now_to+stamp[i]); if(sign>1) return; } return; } void rank(const int kind, const int total, const int require, int now_k, int now_value) { if(!total) return; if(now_k==kind-1) { ans_num[rank_num][now_k]=total; if(require==now_value+ans[1][now_k]*(total)) ++rank_num; return; } for(int i=1; i<=total; ++i) { ans_num[rank_num][now_k]=i; if(now_value+i*ans[1][now_k]>=require) break; rank(kind, total-i, require, now_k+1, now_value+i*ans[1][now_k]); if(rank_num>1) return; } return; } void rank_can(const int kind, const int total,const int require) { rank(kind,total,require,0,0); } void output(int tp) { if(0==sign) printf("%d ---- none/n", tp); else if(2==sign||1==sign) { printf("%d (%d):",tp,f_kind); for(int i=f_kind-1; i>-1; --i) while(ans_num[0][i]--) printf(" %d",ans[0][i]); printf("/n"); } else printf("%d (%d): tie/n",tp,f_kind); return; } void init() { sign=0; pre_begin=-1; rank_num=0; return; } int main() { int tp; while(scanf("%d",&tp)!=EOF) { if(0==tp) { qsort(stamp,all,sizeof(int),cmp); stamp_min(); while(scanf("%d",&tp)) { if(0==tp) break; for(int i=min(4,all); i>0; --i) { for(int j=max(i,1); j<5; ++j) { int a=0; for(int ii=i; ii>0; --ii) a+=stamp[all-ii]; for(int jj=j-i; jj>0; --jj) a+=stamp[all-1]; if(a>tp) break; int b=0; for(int ii=i; ii>0; --ii) b+=stamp[ii-1]; for(int jj=j-i; jj>0; --jj) b+=stamp[0]; if(b<tp) continue; f_kind=i; DFS(i,j,0,tp,0,0); if(sign) break; } if(sign) break; } output(tp); init(); } all=0; } else { stamp[all++]=tp; } } return 0; } 自己做的比较细腻了,按照了一定的顺序进行dfs,0ms,160kb,呵呵,费了好长时间呀。