一、方法一 递归(超时) class Solution { public int combinationSum4(int[] nums, int target) { if (target == 0) { return 1; } int res = 0; for (int num : nums) { if (target >= num) { res += combinationSum4(nums, target - num); } } return res; } } 二、记忆化递归 class Solution { private int[] dp ; public int combinationSum4(int[] nums, int target) { dp = new int[target + 1]; Arrays.fill(dp,-1); dp[0] = 1; return search(nums, target); } private int search(int[] nums, int target) { if (dp[target] != -1) { return dp[target]; } int res = 0; for (int num : nums) { if (target >= num) { res += search(nums, target - num); } } dp[target] = res; return res; } }