Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the output is 7.
Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?
这道题的题意就是给定一个数组,然后用这里面的数来组和出数列,组合出来的数列之和等于给定的目标值,问当给定了数组和目标值以后,一共有多少种组成方法。题目自带的例子也很好的说明了要求。
这显然是一道动态规划的题目,可以从0开始寻找组合的种数,一直找到目标值的组合的种数,核心在于:dp[i]+=dp[ i-nums [j] ]。其中nums[j]表示给定的数组的第j个元素,如果i比数组的任何一个元素都大的话,dp[i]的值就是所有dp[i-nums[j]]的和。如果不是,那就是符合i>=nums[j]的dp[i-nums[j]]的和。
代码如下:
public class Solution {
public int combinationSum4(int[] nums, int target) {
if(target == 0) {
return 0;
}
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]) {
dp[i] += dp[i-nums[j]];
}
}
}
return dp[target];
}
}
这里还要注意的就是target为0的时候要单独判断,要直接返回0(题目已经说了传入的数组元素都会是正数),即0种组合方式。之所以不能用一般情况衡量,是因为一般情况我会把dp[0]设置为1来启动搜索。