//poj 1010
//sep9
#include <iostream>
#include <algorithm>
using namespace std;
int stamp[128],n,sum,ok,tie;
struct SOL
{
int types;
int high;
int num;
int v[8];
}best,now;
int vis[128];
void judge()
{
if(now.types==best.types&&now.num==best.num&&now.high==best.high){
tie=1;
return;
}
if(now.types>best.types)
best=now,tie=0;
else if(now.types==best.types&&now.num<best.num)
best=now,tie=0;
else if(now.types==best.types&&now.num==best.num&&now.high>best.high)
best=now,tie=0;
}
void solve()
{
ok=0,tie=0;
for(int a=0;a<=n;++a)
for(int b=a;b<=n;++b)
for(int c=b;c<=n;++c)
for(int d=c;d<=n;++d){
if(stamp[a]+stamp[b]+stamp[c]+stamp[d]!=sum)
continue;
memset(vis,0,sizeof(vis));
vis[a]=vis[b]=vis[c]=vis[d]=1;
int x,i;
for(x=0,i=1;i<120;++i)
x+=vis[i];
now.types=x;
now.high=max(max(stamp[a],stamp[b]),max(stamp[c],stamp[d])),
now.num=0;
if(a)
now.v[++now.num]=stamp[a];
if(b)
now.v[++now.num]=stamp[b];
if(c)
now.v[++now.num]=stamp[c];
if(d)
now.v[++now.num]=stamp[d];
sort(now.v+1,now.v+1+now.num);
if(ok==0){
best=now;
ok=1;
continue;
}else
judge();
}
if(!ok){
puts("---- none");
return ;
}
if(tie){
printf("(%d): tie\n",best.types);
return ;
}
printf("(%d):",best.types);
for(int i=1;i<=best.num;++i)
printf(" %d",best.v[i]);
puts("");
}
int main()
{
while(1){
n=0;
int t;
if(scanf("%d",&t)==-1)
break;
stamp[0]=0;
if(t)
stamp[++n]=t;
while(scanf("%d",&t)&&t)
stamp[++n]=t;
while(scanf("%d",&sum)==1&&sum){
printf("%d ",sum);
solve();
}
}
return 0;
}
poj 1010 STAMPS 枚举组合
最新推荐文章于 2019-08-01 21:21:14 发布