当前位置: 首页 > news >正文

代码随想录|动态规划|21组合总和IV

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

题目

给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

示例:

  • nums = [1, 2, 3]
  • target = 4

所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)

请注意,顺序不同的序列被视作不同的组合。

因此输出为 7。

思路

这里跟上面那道题的区别在于   “排列!”

排列强调排序顺序,所以先遍历背包,再遍历物品。

物品就是nums数组的每一个元素nums[i]

物品对应的容量也是nums[i]

背包最大容量是target

递推公式为 dp[j] += dp[j-nums[i]];

直接给出代码:

class Solution
{
public:
    /**
     * 计算给定数组nums中元素的组合之和等于target的组合数。
     * 本函数使用动态规划的方法解决问题,避免了重复计算和回溯。
     * 
     * @param nums 包含不同正整数的数组。
     * @param target 目标和。
     * @return 组合数。
     */
    int combinationSum4(vector<int> &nums, int target)
    {
        // 初始化一个长度为target+1的数组dp,用于存储所有和为i的组合数。
        vector<uint64_t> dp(target + 1);
        // 基础情况:和为0的组合数为1,即什么都不选。
        dp[0] = 1;
    
        // 外层循环遍历所有可能的和,从1到target。
        for (int j = 0; j <= target; j++)
        {
            // 内层循环遍历数组nums中的每个元素。
            for (int i = 0; i < nums.size(); i++)
            {
                // 如果当前元素nums[i]小于等于当前和j,则可以将nums[i]加入组合中。
                if (j >= nums[i])
                    // 更新dp[j],增加以nums[i]结尾的组合数。
                    dp[j] += dp[j - nums[i]];
            }
        }
        // 返回目标和为target的组合数。
        return dp[target];
    }
};

总结

参考资料

 代码随想录

http://www.dtcms.com/a/109803.html

相关文章:

  • 从零开始:使用Spring Boot和MyBatis实现CRUD操作全攻略
  • 25.Reactor
  • PHP代码审计-01
  • RAGFlow 知识库分段研究
  • 码界奇缘 Java 觉醒 第一章 命运的终端
  • 数据驱动防灾:AI 大模型在地质灾害应急决策中的关键作用。基于DeepSeek/ChatGPT的AI智能体开发
  • 关于inode,dentry结合软链接及硬链接的实验
  • 线性代数:分块矩阵,秩,齐次线性,非齐次线性的解相关经典例题
  • 带头结点 的单链表插入方法(头插法与尾插法)
  • 纪检委行业光盘安全隔离与数据摆渡应用方案
  • 笔记:背包问题总结
  • 【PHP】- 项目通用目录架构及示例demo
  • 【LLM之评测】AlignBench: Benchmarking Chinese Alignment of Large Language Models
  • Docker 常用指令速查
  • TDengine 重磅功能虚拟表
  • Spring Security(maven项目) 3.1.0
  • 青少年编程与数学 02-015 大学数学知识点 06课题、离散数学
  • Linux驱动开发进阶(三)- 热插拔机制
  • Scala基础知识
  • 数据结构学习
  • 混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解
  • UEFI镜像结构布局
  • 蓝桥杯刷题记录【并查集001】(2024)
  • DeepSeek真的超越了OpenAI吗?
  • 黑马点评项目总结
  • 迭代器、迭代对象的 __iter__() 和 __next__()详解
  • 使用Python快速接入DeepSeek API的步骤指南
  • 【Python使用】嘿马python数据分析教程第2篇:会员存量增量分析,增量等级分布分析【附代码文档】
  • 计算机网络-TCP的流量控制
  • 蓝桥杯嵌入式16届———LCD模块