LeetCode-in-All

416. Partition Equal Subset Sum

Medium

Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Example 1:

Input: nums = [1,5,11,5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:

Input: nums = [1,2,3,5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.

Constraints:

Solution

-spec can_partition(Nums :: [integer()]) -> boolean().
can_partition(Nums) ->
    Sum = lists:sum(Nums),
    case Sum rem 2 of
        0 ->
            Target = Sum div 2,
            Dp = lists:foldl(
                fun(Num, Acc) ->
                    maps:fold(
                        fun(Sum0, true, InnerAcc) ->
                            case Sum0 + Num =< Target of
                                true -> InnerAcc#{Sum0 + Num => true};
                                false -> InnerAcc
                            end;
                        (_, false, InnerAcc) -> InnerAcc
                        end,
                        Acc#{Num => true},
                        Acc)
                end,
                #{0 => true},
                Nums),
            maps:get(Target, Dp, false);
        _ ->
            false
    end.