题目:
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
例如:
输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
思路:本题求的是排列方案。
动态规划五部曲:
1.确定dp数组及含义
dp数组是一维数组(滚动数组),dp[j]代表数值总和为target的排列方案有多少。
2.确定推导公式
dp[j]+=dp[j-nums[i]]
3.初始化dp数组
dp[0]=1,意思是数值总和为0的排列方案有一种。如果dp[0]=0,那么接下来的推导都为0。其他值初始化为0
4.确定遍历序列
外层for循环正序遍历背包容量,内层for循环正序遍历物品(nums)。
5.举例推导dp数组
输入:nums=[1,2,3],target=4
dp[0]=1
dp[1]=dp[0]=1
dp[2]=dp[1]+dp[0]=2
dp[3]=dp[2]+dp[1]+dp[0]=4
dp[4]=dp[3]+dp[2]+dp[1]=7
代码:
public int combinationSum4(int[] nums, int target) {
int[] dp=new int[target+1];
dp[0]=1;
for(int j=0;j<=target;j++){
for(int i=0;i<nums.length;i++){
if(j-nums[i]>=0)
dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}