Skip to content

2218. Maximum Value of K Coins From Piles

Difficulty Topics

Description

There are n piles of coins on a table. Each pile consists of a positive number of coins of assorted denominations.

In one move, you can choose any coin on top of any pile, remove it, and add it to your wallet.

Given a list piles, where piles[i] is a list of integers denoting the composition of the ith pile from top to bottom, and a positive integer k, return the maximum total value of coins you can have in your wallet if you choose exactly k coins optimally.

 

Example 1:

Input: piles = [[1,100,3],[7,8,9]], k = 2
Output: 101
Explanation:
The above diagram shows the different ways we can choose k coins.
The maximum total we can obtain is 101.

Example 2:

Input: piles = [[100],[100],[100],[100],[100],[100],[1,1,1,1,1,1,700]], k = 7
Output: 706
Explanation:
The maximum total can be obtained if we choose all coins from the last pile.

 

Constraints:

  • n == piles.length
  • 1 <= n <= 1000
  • 1 <= piles[i][j] <= 105
  • 1 <= k <= sum(piles[i].length) <= 2000

Solution

maximum-value-of-k-coins-from-piles.py
class Solution:
    def maxValueOfCoins(self, piles: List[List[int]], K: int) -> int:
        rows, cols = len(piles), len(piles[0])

        @cache
        def go(rowIndex, k):
            if k == 0: return 0
            if rowIndex == rows: return 0

            res = 0
            curr = 0
            currK = k

            # skip to take this
            res = max(res, go(rowIndex + 1, k))

            for i, x in enumerate(piles[rowIndex]):
                curr += x
                currK -= 1

                if currK >= 0:
                    res = max(res, curr + go(rowIndex + 1, currK))
                else:
                    break

            return res

        return go(0, K)