import java.util.*;


public class Solution {
    
    public int num = 0; // 定义一个整型变量,用于存放数组中全部数字相加的结果

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param nums int整型一维数组
     * @return bool布尔型
     */
    public boolean partition(int[] nums) {
        // write code here
        // 一些特殊情况的处理
        if (1 == nums.length) {
            return false;
        }
        // 求出 num
        for (int i = 0; i < nums.length; i++) {
            num += nums[i];
        }
        // 如果数组中的数字全部相加的结果为奇数,那么一定是 false(根本无法均分成两份)
        if (num % 2 != 0) {
            return false;
        }
        // 记忆化搜索
        int[][] dp = new int[nums.length + 1][num + 1];
        for (int i = 0; i < nums.length + 1; i++) {
            for (int j = 0; j < num + 1; j++) {
                dp[i][j] = Integer.MIN_VALUE;
            }
        }
        return process(nums, 0, 0, dp) == 1 ? true : false;
    }

    public int process(int[] nums, int index, int currentNum, int[][] dp) {
        if (dp[index][currentNum] == Integer.MIN_VALUE) {
            if (currentNum * 2 == num) {
                dp[index][currentNum] = 1;
            } else if (index >= nums.length) {
                dp[index][currentNum] = 0;
            } else {
                dp[index][currentNum] = Math.max(process(nums, index + 1, currentNum, dp), process(nums, index + 1, currentNum + nums[index], dp));
            }
        }
        return dp[index][currentNum];
    }
}