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

完全背包变体-排列和组合的循环顺序问题

排列,区分顺序:内层循环物品{1,2},可以让3-2->1-1和3-1->2-2都计算一遍。
组合不区分顺序:外层循环物品{1,2},只会按照物品顺序填充

总结:排列问题中,每个容量的状态更新时,允许任何物品作为最后一步加入(例如和为3时,可以是1+2或2+1),从而覆盖所有顺序;组合问题中,物品按固定顺序处理,只允许在已固定的组合末尾追加新物品,避免重复计算不同顺序的组合。

518. 零钱兑换 II 组合问题,不区分物品的组合顺序

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        int n=coins.size();
        using ll=unsigned long long;
        vector<ll>dp(amount+10,0);
        dp[0]=1;//不需要钱的时候,只有一种方案
        for(auto&& coin:coins)//内层遍历硬币会将金额j的dp覆盖
        for(int j=1;j<=amount;j++){
            if(j>=coin){//转移到上一个金额的方案
                dp[j]=dp[j]+dp[j-coin];//dp[coins.size()-1,j]+dp[coins.size(),j-coin]
            }
        }
        return dp[amount];
    }
};

377. 组合总和 Ⅳ 排列问题,区分物品的组合顺序

class Solution {
public:

    int combinationSum4(vector<int>& nums, int target) {
        using ll=unsigned long long;
        vector<ll>dp(target+10,0);
        /*
        排列,区分顺序:内层循环物品{1,2},可以让3-2->1-1和3-1->2-2都计算一遍。
        组合不区分顺序:外层循环物品{1,2},只会按照物品顺序填充
        */
        dp[0]=1;//0的时候只有一种组合方式
        for(int j=1;j<=target;j++){
            for(auto&& num:nums){
                if(j>=num)
                    dp[j]+=dp[j-num];
            }
        }
        return dp[target];
    }
};

相关文章:

  • 【Linux学习笔记】Linux基本指令及其发展史分析
  • C++(三)类与对象 中
  • Spring MVC 处理请求
  • MRI学习笔记-Meta分析
  • Eureka Server 数据同步原理解析
  • NodeJS服务器 + Vue3框架 从搭建服务器 定义接口 到请求数据页面展示
  • 【杂谈】-Meta AI的可扩展内存层
  • 养老小程序方案详解居家养老小程序系统
  • 第十章 数据库恢复技术
  • 我的AI工具箱Tauri版-通用音频转文本
  • 智能图像处理平台:RabbitMQ配置
  • Unclutter for Mac v2.2.12 剪贴板/文件暂存/笔记三合一 支持M、Intel芯片
  • 安卓基础组件Looper - 03 java层面的剖析
  • Spring Cloud Gateway 网关的使用
  • Stiring-PDF:开源免费的PDF文件处理软件
  • 记一次误禁用USB导致键盘鼠标失灵的修复过程
  • 【鸿蒙Next】鸿蒙与flutter使用自定义iconfont的ttf字体库对比总结
  • 大模型分布式训练和优化
  • 游戏引擎学习第133天
  • nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析
  • 张巍任中共河南省委副书记
  • 降水较常年同期少五成,安徽四大水利工程调水超11亿方应对旱情
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新
  • 中国至越南河内国际道路运输线路正式开通
  • 郑培凯:汤显祖的“至情”与罗汝芳的“赤子之心”
  • 2025年两岸关系研讨会在上海开幕