LeetCode 377:组合总和 Ⅳ(Combination Sum IV)—— 题解 ✅

LeetCode 377:组合总和 Ⅳ(Combination Sum IV)------ 题解 ✅

📖 内容概要

给定一个由 不同整数 组成的数组 nums 和一个目标整数 target,

计算并返回 所有可能的组合个数 ,使得这些整数的和为 target。

✅ 元素可重复使用

✅ 顺序不同的序列视为不同组合

✅ 本质是 完全背包 + 排列计数


💡 解题思路

一、问题本质

  • 数字可以无限使用 ✅
  • [1,1,2]、[1,2,1]、[2,1,1] 算 三种方案 ✅

👉 这是一个 排列问题(Permutation)


二、DP 定义

java 复制代码
dp[j] = 凑成金额 j 的排列数

三、状态转移方程

java 复制代码
dp[j] += dp[j - nums[i]]

含义:

  • 使用 nums[i] 作为最后一个数字
  • 新增方案数 = 凑成 j - nums[i] 的方案数

🔥 核心重点:遍历顺序(本题灵魂)

✅ 正确的遍历顺序(排列数)

java 复制代码
for (int j = 0; j <= target; j++) {      // 背包
    for (int i = 0; i < nums.length; i++) { // 物品
        if (j >= nums[i]) {
            dp[j] += dp[j - nums[i]];
        }
    }
}
为什么这样写?
层级 含义
外层 j 枚举总金额
内层 i 枚举所有可用的数字

✅ 每一个金额都可以由任意数字结尾

✅ 自然形成 排列顺序差异

✅ 得到的是 排列数


❌ 错误的遍历顺序(组合数)

java 复制代码
for (int i = 0; i < nums.length; i++) {
    for (int j = nums[i]; j <= target; j++) {
        dp[j] += dp[j - nums[i]];
    }
}

❌ 会限制数字使用顺序

❌ 只能得到组合数


🔑 记忆口诀(非常重要)

完全背包

  • 组合数:先物品,后背包
  • 排列数:先背包,后物品

✅ AC 代码(Java)

java 复制代码
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1; // 凑成 0 有 1 种方式

        // 先遍历背包
        for (int j = 0; j <= target; j++) {
            // 再遍历物品
            for (int i = 0; i < nums.length; i++) {
                if (j >= nums[i]) {
                    dp[j] += dp[j - nums[i]];
                }
            }
        }
        return dp[target];
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(target × nums.length)
空间复杂度 O(target)

🔍 与「零钱兑换 II」的对比

题目 518. 零钱兑换 II 377. 组合总和 IV
是否无限使用 ✅ ✅
是否区分顺序 ❌ 不区分 ✅ 区分
遍历顺序 先物品 先背包
DP 含义 组合数 排列数

✅ 一句话总结

完全背包 + 排列计数 = 外层金额、内层物品,正序遍历。

相关推荐
UIU1142 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场2 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi2 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David3 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院4 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng4 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~7 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py8 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing9 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客9 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法