377.组合总和 Ⅳ(背包)

链接:377. 组合总和 Ⅳ - 力扣(LeetCode)

题解:

组合总和 IV

dpi 目标位i的组合组数是多少

dpi = dpi-A0 + dpi-A\[1] .. dp1-A\[n-1],枚举所有最后一个数字的可能

cpp 复制代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int len = nums.size();
        if (len <= 0) {
            return 0;
        }
        vector<unsigned long long> dp(target + 1, 0);
        dp[0] = 1;
        for (int i = 0; i <= target; ++i) {
            for (int j = 0; j < nums.size(); ++ij) {
                if (i - nums[j] >= 0) {
                    dp[i] += dp[i - nums[j]];
                }
            }
        }
        return dp[target];
    }
};

外层循环决定"转移时被复用的 dp 值是完整的,还是只含部分物品的"。

本题 dp[j] 的语义是"和为 j 的排列数",转移是:

cpp

复制代码
dp[j] = Σ_{num ∈ nums, num ≤ j} dp[j - num]

要让这个式子成立,右边每个 dp[j - num] 必须是完整的排列数(所有物品都能参与)。而它什么时候完整,取决于循环顺序。

1. 从"最后一步"看

一个和为 j 的排列,最后一步 可以是任意 num,前面部分是任意和为 j - num 的排列。

所以:

text

复制代码
dp[j] = dp[j-1] + dp[j-2] + dp[j-3] + ...
        ↑ 最后一步是 1、2、3……

这里 dp[j-num] 必须是"任何物品都能用"的完整排列。

外层容量 j:

cpp

复制代码
for (int j = 1; j <= target; ++j)
    for (int num : nums)
        dp[j] += dp[j - num];

当你在第 j 层累加时,dp[j-num] 已经在之前的轮次里把所有物品都累加完了,它是完整的。✓

外层物品 num:

cpp

复制代码
for (int num : nums)
    for (int j = num; j <= target; ++j)
        dp[j] += dp[j - num];

当你在处理物品 num 时,dp[j-num] 只吸收了当前及之前处理过的物品,还没轮到后面的物品。它是"半成品"。用半成品去转移,就等于强制"前面的物品编号 ≤ 当前物品编号"

相关推荐
上海潭龙东海科技有限公司4 分钟前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP2 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀3 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落4 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光4 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu5 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
Pniubi5 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
普通人65 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂6 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法