Solution 1: backtrack(TLE)
class Solution {
public int combinationSum4(int[] nums, int target) {
Arrays.sort(nums);
int ans=0;
return backtrack(nums, target, 0, ans);
}
public int backtrack(int[] nums, int target, int sum, int ans){
if(sum==target){
ans++;
return ans;
}
for(int i=0;i<nums.length;i++){
if(sum+nums[i]<=target){
sum+=nums[i];
ans= backtrack(nums, target, sum , ans);
sum-=nums[i];
}
}
return ans;
}
}
Solution 2: recursive(TLE)
class Solution {
public int combinationSum4(int[] nums, int target) {
int res=0;
if(target==0){return 1;}
for(int i=0;i<nums.length;i++){
if(nums[i]<=target){
res+=combinationSum4(nums, target-nums[i]);
}
}
return res;
}
}
Solution 3: top down dp
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp=new int[target+1];
Arrays.fill(dp,-1);
return helper(nums, target, dp);
}
public int helper(int[] nums, int target, int[] dp){
int res=0;
if(target==0)return 1;
if(dp[target]!=-1){
return dp[target];
}
for(int i=0;i<nums.length;i++){
if(nums[i]<=target){
res+=helper(nums,target-nums[i],dp);
}
}
dp[target]=res;
return dp[target];
}
}
Solution 4: bottom up dp
思路:总问题是求4,子问题是如果我选了一个是数1了,问题变成了求3;如果我选了2,问题变成了求2。所以现在大问题变成个两个小的子问题
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp=new int[target+1];
dp[0]=1;
for(int i=1;i<=target;i++){
for(int j=0;j<nums.length;j++){
if(i-nums[j]>=0)
dp[i]+=dp[i-nums[j]];
}
}
return dp[target];
}
}