题目:
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1:
输入: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)
请注意,顺序不同的序列被视作不同的组合。
示例 2:
输入:nums = [9], target = 3
输出:0
题解:
转化为是否可以用 nums 中的数组合和成 target,完全背包问题,并且为“考虑排列顺序的完全背包问题”,外层循环为 target ,内层循环为选择池 nums。
dp[i] 表示和为 i 的 num 组合有 dp[i] 种。
外层遍历 target;
内层遍历 nums 每个 num。
对于元素之和等于 i - num 的每一种排列,在最后添加 num 之后即可得到一个元素之和等于 i 的排列,因此在计算 dp[i] 时,应该计算所有的 dp[i − num] 之和。
dp[i] = dp[i] + dp[i - num]
对于边界条件,我们定义 dp[0] = 1 表示只有当不选取任何元素时,元素之和才为 0,因此只有 1 种方案。
最后返回 dp[target]
import java.util.Arrays;
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++) {
//可以加上“ && dp[i] + dp[i - nums[j]] < Integer.MAX_VALUE”,也可以不加
if (nums[j] <= i) {
dp[i] = dp[i] + dp[i - nums[j]];
}
}
}
return dp[target];
}
}
/**
* @author wyl
*/
public class Main {
public static void main(String[] args) {
int[] nums = {1, 2, 3};
int target = 4;
Solution s = new Solution();
int res = s.combinationSum4(nums, target);
System.out.println(res);
}
}