377. 组合总和IV


完全背包

class Solution {
    public int combinationSum4(int[] nums, int target) {

        /**
         * dp[i]定义为总和为i时排列的数量
         * 初始dp[0] == 1
         */
        int[] dp = new int[target + 1];
        dp[0] = 1;

        /**
         * 完全背包中,每个数字可以重复使用
         * 因此内循环要从小到大遍历
         * 对于求组合数,dp[i](考虑nums[j]的组合总和)就是所有的dp[i - nums[j - 1]](不考虑nums[j])相加
         * 如果求组合数就是外层for循环遍历物品,内层for遍历背包
         * 如果求排列数就是外层for遍历背包,内层for循环遍历物品
         */
        for (int i = 0; i <= target; i++) {

            for (int j = 1; j <= nums.length; j++) {

                if (i >= nums[j - 1]) {
                    dp[i] += dp[i - nums[j - 1]];
                }
            }
        }

        return dp[target];
    }
}

/**
 * 时间复杂度 O(target*n)
 * 空间复杂度 O(target)
 */

https://leetcode-cn.com/problems/combination-sum-iv/