#include #include using namespace std; const int MAXDICE = 20; const int MAXFACES = 20; const int MAXFACEVAL = 50; const int MAXDESIRED = 10; int currDie[MAXFACES]; int vals[MAXDICE*MAXFACEVAL][2]; struct target { int val; long num; } desired[MAXDESIRED]; bool checkDesired(int n) { for(int i=0; i 0) { desired[i].num -= vals[desired[i].val-val][0]; if (desired[i].num < 0) ok = false; } } if (ok) { if (findDie(numFaces, numVals, face+1, val, min)) return true; } for(i=0; i 0) { desired[i].num += vals[desired[i].val-val][0]; } } for(i=0; i= desired[i].val && desired[i].num != 0) return false; } if (++val > MAXFACEVAL) return false; currDie[face] = val; } return false; // should never happen } int main() { int n; cin >> n; while (n != 0) { for(int j=0; j> f; totalFaces *= f; for(int j=0; j> val; for(int j=0; j 0) vals[j+val][0] += vals[j][1]; } } } int r, m; cin >> r >> m; for(int k=0; k> desired[k].val >> desired[k].num; } int min=0; while (vals[min][0] == 0) min++; if (findDie(r, m, 0, 1, min)) { cout << "Final die face values are"; for(int k=0; k> n; } return 0; }