vector<vector<int> > combinationSum(vector<int> &candidates, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function if (candidates.size() == 0) return vector<vector<int> >(); sort(candidates.begin(),candidates.end()); vector<vector<vector<int> > > *pR = new vector<vector<vector<int> > >(target + 1); vector<vector<vector<int> > > *pT = new vector<vector<vector<int> > >(target + 1); for (int t = 1; t <= target; ++ t) { int c = candidates[0]; if (t % c == 0) { (*pR)[t].push_back(vector<int>(t/c,c)); } } for (int k = 1; k < candidates.size(); ++k) { int ck = candidates[k]; for (int t = 1 ; t <= target; ++t) { (*pT)[t].clear(); for (int p = 0; p * ck <= t; ++p) { int remain = t - ck * p; if (remain == 0) { (*pT)[t].push_back(vector<int>(p,ck)); } else { vector<vector<int> > &rRemain = (*pR)[remain]; for (int irr = 0; irr < rRemain.size() ;++ irr) { vector<int> newSum(rRemain[irr]); for(int ip = 0; ip < p; ++ip) newSum.push_back(ck); (*pT)[t].push_back(newSum); } } } } vector<vector<vector<int> > > *pTemp = pR; pR = pT; pT = pTemp; } return (*pR)[target]; }
void think() { title(); draw(); if (turn == COMPUTER) { printf("\nBom, agora e minha vez, posso jogar? (1:sim) "); get(); int sum; bool isSec = false; for (int x=1; x<7 && !isSec; x++) { for (int y=0; y<4 && !isSec; y++) { if ( (comb[y] == 0) || (comb[y] - x < 0) ) continue; sum = newSum(y) + nBin[ comb[y]-x ]; if (isSecure(sum) == true) { isSec = true; comb[y] -= x; sticksCount -= x; } } } if(isSec == false) { for(int i=0; i<4; i++) { if(comb[i] != 0) { comb[i] -= 1; sticksCount--; break; } } } turn = PLAYER; } else if (turn == PLAYER) { int row, count; printf("Ok, entao digite a fileira que deseja operar (1-4): "); row = get() - 48; printf("Ok, agora me informe quantas pecas deseja remover: "); count = get() - 48; comb[row-1] -= count; sticksCount -= count; turn = COMPUTER; } }