3
int dp[1001][2001]; // Dp array For Memoization.4
int solve(vector<vector<int>> &v, int index, int coin) {5
if (index >= v.size() || coin == 0) // Base Condition7
if (dp[index][coin] != -1) // Check wheather It is Already Calculated Or9
return dp[index][coin];11
/* Our 1st choice :- We not take any Coin from that pile*/12
int ans = solve(v, index + 1, coin); // Just Call function for next Pile.14
/*Otherwise we can take Coins from that Pile.*/15
int loop = v[index].size() - 1;18
for (int j = 0; j <= min(coin - 1, loop); j++) //20
sum = sum + v[index][j];21
ans = max(ans, sum + solve(v, index + 1, coin - (j + 1)));23
/*Aove we Pass coin-(j+1). Because till j'th index we have taken j+1 coin27
return dp[index][coin] = ans;29
int maxValueOfCoins(vector<vector<int>> &piles, int k) {30
memset(dp, -1, sizeof(dp));31
return solve(piles, 0, k);