// combat #include #include #include using namespace std; enum op{ DUP=2,ADD=0,SUB=4,MUL=3,DIV=1 }; int inp[10],ans[10],n; int ansop[10],ansopnum; bool alpord(int *a,int *b,int n) { for (int i=0;ib[i]) return true; } return false; } void showops(int *ops,int n) { for (int i=0;i &stk,int depth,int *ops,int sans) { if (stk.size()==1&&stk.top()==sans){ // 答えの候補が見つかった //cout<<"found!"< s; s.push(inp[i]); for (int op=0;op30000) goto _next; s.push(a+b); break; } case SUB: { int a=s.top();s.pop(); int b=s.top();s.pop(); if (abs(b-a)>30000) goto _next; s.push(b-a); break; } case MUL: { int a=s.top();s.pop(); int b=s.top();s.pop(); if (abs(a*b)>30000) goto _next; s.push(a*b); break; } case DIV: { int a=s.top();s.pop(); int b=s.top();s.pop(); if (a==0) goto _next; if (abs(b/a)>30000) goto _next; s.push(b/a); break; } } } if (s.top()!=ans[i]) goto _next; } if (ansopnum>depth||(ansopnum==depth&&alpord(ansop,ops,depth))){ ansopnum=depth; for (int o=0;o=ansopnum) return; if (stk.size()==1){ ops[depth]=DUP; stk.push(stk.top()); solve(stk,depth+1,ops,sans); stk.pop(); } else{ if (!(stk.size()>=10-depth+1)){ ops[depth]=DUP; stk.push(stk.top()); solve(stk,depth+1,ops,sans); stk.pop(); } if (stk.size()>=2){ int ra=stk.top();stk.pop(); int rb=stk.top();stk.pop(); if (abs(ra+rb)<=30000){ ops[depth]=ADD; stk.push(ra+rb); solve(stk,depth+1,ops,sans); stk.pop(); } if (abs(rb-ra)<=30000){ ops[depth]=SUB; stk.push(rb-ra); solve(stk,depth+1,ops,sans); stk.pop(); } if (abs(ra*rb)<=30000){ ops[depth]=MUL; stk.push(ra*rb); solve(stk,depth+1,ops,sans); stk.pop(); } if (ra!=0&&abs(rb/ra)<=30000){ ops[depth]=DIV; stk.push(rb/ra); solve(stk,depth+1,ops,sans); stk.pop(); } stk.push(rb); stk.push(ra); } } } int main() { ifstream cin("optimal.txt"); for (int prob=1;;prob++){ cin>>n; if (n==0) break; int i; for (i=0;i>inp[i]; for (i=0;i>ans[i]; stack stk; stk.push(inp[0]); int ops[10]={0}; ansopnum=11; solve(stk,0,ops,ans[0]); cout<<"Program "<