LeetCode 416 — Partition Equal Subset Sum

Duodécimo y último problema de DP 1-D. 0-1 knapsack clásico: ¿podemos llenar exactamente sum/2 con los elementos? Cada elemento se usa a lo sumo una vez.

Enunciado

Dado un array de enteros positivos, devuelve True si se puede dividir en dos subconjuntos con la misma suma.


Solución — DP con set

class Solution:
    def canPartition(self, nums):
        total = sum(nums)
        if total % 2 != 0: return False
        target = total // 2
 
        dp = {0}                                 # sumas alcanzables
        for n in nums:
            dp |= {s + n for s in dp}            # añadir nuevas sumas
            if target in dp:
                return True
        return False

Análisis: O(n · target).

Por qué set

dp mantiene todas las sumas alcanzables con algún subconjunto. Para cada nuevo número, las nuevas sumas posibles son las antiguas + n. Si alcanzamos target, listo.


Cierre DP 1-D

#ProblemaIdea distintiva
170-climbing-stairsFibonacci
2746-min-cost-climbing-stairsFib con costes
3198-house-robberTake or skip
4213-house-robber-iiCircular: dos pasadas
55-longest-palindromic-substringExpand around center
6647-palindromic-substringsContar palíndromos
791-decode-waysFib con condicional
8322-coin-changeUnbounded knapsack
9152-maximum-product-subarrayTrack min y max
10139-word-breakDP sobre split de string
11300-longest-increasing-subsequenceLIS — DP o patience sort
12Este0-1 knapsack con set

Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode
  • Patrón DP 1-D cerrado [OK]