http://poj.org/problem?id=1010
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int s[100]={0};
int ju[100]={0};
int re[5],renum=0;
int irenum=0;
int innum;
int tiesign=0;
void dfs(int cur,int num,int sign)
{
for(int i=sign;i<innum;i++){
if(s[i]<num && cur<4){
ju[i]++;
dfs(cur+1,num-s[i],i);
ju[i]--;
}
if(s[i]==num && cur<4){
int ire[5]={0};
irenum=0;
ju[i]++;
int irep=0,rep=0;
for(int j=0;j<innum;j++){
if(ju[j]!=0){
irenum++;
for(int k=0;k<ju[j];k++){
ire[irep]=s[j];
irep++;
}
}
}
int ti=0;
int totalre=0,totalire=0;
if(irenum>renum) ti=1;
if(irenum==renum){
while(re[totalre]) totalre++;
while(ire[totalire]) totalire++;
if(totalre>totalire) ti=1;
}
int tisign=0;
if(irenum==renum && totalre==totalire){
for(int k=0;k<1;k++){
if(ire[k]>re[k]){
tisign=1;
break;
}
if(ire[k]<re[k]){
tisign=2;
break;
}
}
if(tisign==1) ti=1;
}
if(irenum==renum && totalre==totalire && tisign==0) tiesign=1;
if(ti==1){
renum=irenum;
for(int k=0;k<5;k++){
re[k]=ire[k];
}
tiesign=0;
}
ju[i]--;
}
}
}
bool judge(int a,int b){
if(a>b) return true;
else return false;
}
int main()
{
int x;
while(cin>>x){
innum=1;
s[0]=x;
while(cin>>x){
if(x==0) break;
s[innum]=x;
innum++;
}
sort(s,s+innum,judge);
int cus,cusnum=0;
while(cin>>cus){
if(cus==0) break;
renum=0;
irenum=0;
dfs(0,cus,0);
if(renum==0)
cout<<cus<<" ---- none"<<endl;
else if(tiesign==1)
cout<<cus<<" ("<<renum<<"): tie"<<endl;
else{
cout<<cus<<" ("<<renum<<"):";
for(int i=4;i>=0;i--){
if(re[i]==0) continue;
else cout<<' '<<re[i];
}
cout<<endl;
}
}
}
return 0;
}