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

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

排列,区分顺序:内层循环物品{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];
    }
};


http://www.kler.cn/a/570878.html

相关文章:

  • 【硬核拆解】DeepSeek开源周五连击:中国AI底层技术的“破壁之战”
  • Java学习——day13
  • Unity插件-Mirror使用方法(三)组件介绍(Network Manager)
  • JavaScript 私有属性的实现方式及对比
  • 文本处理Bert面试内容整理-BERT的基本原理是什么?
  • 【论文分析】语义驱动+迁移强化学习:无人机自主视觉导航的高效解决方案(语义驱动的无人机自主视觉导航)
  • 基于 Rust 与 GBT32960 规范构建高并发、高可用、高扩展服务端程序
  • EGO-Planner的无人机视觉选择(yolov5和yolov8)
  • 记录遇到的面试题
  • FPGA开发,使用Deepseek V3还是R1(1):应用场景
  • android 系统 wms详解
  • HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统
  • 为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
  • 8295智能座舱弹窗点击问题,点击window之外的区域,window不消失的问题。touchableRegion的问题分析(android 13)
  • DNS 详细过程 与 ICMP
  • aiohttp、httpx 和 requests 的区别
  • 五分钟快速学习优秀网站的HTML骨架布局设计
  • 比亚迪“灵鸢”来袭,汽车+无人机梦幻联动!
  • Qt:day1
  • LeetCode 热题 100 链表章节