【总结】用树形图和剪枝操作理解完全背包问题中组合数和排列数问题

2023-11-14



前言

建议先看理清0-1背包问题和完全背包问题,再来看此博客,更加便于理解~~

一、完全背包中的排列数和组合数问题

1.1 问题来源

零钱兑换II

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

首先明确:组合不强调元素之间的顺序,排列强调元素之间的顺序。

例如:
5 = 2 + 2 + 1
5 = 2 + 1 + 2
这是一种组合,都是 2 2 1。
如果问的是排列数,那么上面就是两种排列了。

如何实现统计的是组合数还是排列数呢?

  • 关键在于内外两层遍历的顺序,即:本题中我们是外层for循环遍历物品(钱币),内层for遍历背包(金钱总额),还是外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)。
  • 对于完全背包问题的两个for循环的先后顺序都是可以的,这是因为因为纯完全背包求得是能否凑成总和,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行。
  • 本题是求凑出来的方案个数,且每个方案个数是为组合数,元素之间要求没有顺序,故要考虑两个for循环的顺序。

1.2 两个for循环先后顺序分析

对于coins = {1,2,5}, amount = 5:

1.2.1 先遍历背包后遍历物品得到排列数

我们先来看 外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)的情况。

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

对于amount = 4 时 我们可以计算出 dp[4] = 5 即:
4 = 1 + 1 + 1 + 1
4 = 1 + 1 + 2
4 = 1 + 2 + 1
4 = 2 + 1 + 1
4 = 2 + 2
画成树形图 如下:可知此时我们得到的是排列数
在这里插入图片描述

1.2.2 先遍历物品后遍历背包得到组合数

由上一节我们可知先遍历背包(金额总数)后遍历物品(物品)可得到排列数,那么如何得到组合数呢,观察上一小节中的树形图,我们进行剪枝:
在这里插入图片描述

剪枝后我们得到
4 = 1 + 1 + 1 + 1
4 = 2 + 1 + 1
4 = 2 + 2
即剪去了
4= 4 = 1 + 1 + 2
4 = 1 + 2 + 1
此时得到组合数!!!

观察剪枝图片可知,此时等价于我们在计算硬币1如何组成4时,我们只考虑用硬币1;在计算硬币2如何组成4时,我们只考虑用硬币2和硬币1如何组成4。则即统计组合数的问题变成了:前 i个硬币凑齐金额 j 的方案数目。这就是先遍历物品(硬币)后遍历背包(金钱总额)!!!
实现代码为:

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

小结

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
想要理解两种循环的区别,就从上面的树形图去理解~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【总结】用树形图和剪枝操作理解完全背包问题中组合数和排列数问题 的相关文章

随机推荐

  • MMDet——EMA更新hook详解

    Hook 首先需要明白mmdet中hook机制 EMA就是建立在Hook机制上的 推荐一个Hook详解 深度理解目标检测 MMdetection HOOK机制 EMA 指数平均 exponential mean average 一般来说 在
  • 使用Google Guava Cache Util工具类实现本地缓存设置过期时间的Java应用

    使用Google Guava Cache Util工具类实现本地缓存设置过期时间的Java应用 随着互联网应用的发展 缓存成为提高系统性能和响应速度的关键技术之一 而在Java开发中 Google Guava提供了一个强大的缓存工具类 Ca
  • 关于数据库表字段的数据权限设计

    吐槽 刚在同事的帮忙下 把maven工程成功导入到eclipse 期间遇到的最大问题就是安装eclipse插件 花费了其中大部分的时间 现在做的研发产品 遇到的一个新的需求是 控制外部系统对于表中字段的访问权限 其实说白了 就是 对于CRU
  • sklearn机器学习包中的对原始数据的预处理及训练集、测试集的分割

    sklearn机器学习包中的对原始数据的预处理及训练集 测试集的分割 一 数据预处理 1 标准化 2 归一化 3 最小最大标准化 4 缺失值插补 二 训练集测试集的划分 一 数据预处理 sklearn preprocessing 包提供了几
  • 编码-整数

    计算机中存储的数值 正数为其原码 而负数存的是其补码 正数 原码 用最高位表示符号位 其余位表示数值 其中 正数的符号位为 0 负数的符号位为 1 正整数转成二进制 除二取余 直到商为零或一时为止 然后倒序排列 举个栗子 121 gt 0
  • 【蓝桥杯】什么算法才是版本答案?近三年(2019-2021)蓝桥杯省赛涉及算法出现频率分析

    2022年的蓝桥杯比赛已经基本报名结束 寒假来临 如何抓住重点 快速掌握各种算法知识 在4月份的蓝桥杯省赛中取得好成绩呢 本文收集了近三年的4场蓝桥杯省赛题目 2019年 2020年第二场 2020年第三场 2021年 并总结了题目涉及的算
  • python是一门机器语言_python是一门怎样的编程语言?

    大家应该都听说过python语言 也知道它是一门非常适合零基础学习的语言 但是对于没有接触过的人来说可能就疑惑python到底是一门什么样的编程语言 1 跨平台 跨平台不依赖操作系统和硬件环境 某个操作系统环境下开发的应用 放在其他的系统中
  • angular中的组件嵌套

    1 创建3个包 header module main module sliderbar module 2 在header module创建三个组件 header center heder left header right 3 z将三个组件
  • BP神经网络回归预测-MATLAB代码实现(代码完整直接可用,注释详细,可供新手学习)

    一 前言 代码获取 私信或附评论区 BP神经网络预测回归MATLAB代码 代码完整可用 复制后即可运行使用 操作简单 1 BP神经网络的知识想必不用再过多介绍 本篇文章从实际应用的角度 针对新手应用者 针对不需要过多了解BP 但是需使用MA
  • Java-主流框架—(4)SpringMVC

    1 SpringMVC概述 三层架构 表现层 负责数据展示 业务层 负责业务处理 数据层 负责数据操作 MVC Model View Controller 一种用于设计创建Web应用程序表现层的模式 Model 模型 数据模型 用于封装数据
  • javaScript基础面试题 --- JS作用域

    面试10家公司 得有8家会问到作用域的题 所以说JS的作用域一定要弄清楚 非常重要 1 除了函数之外 JS没有块级作用域 2 作用域链 内部可以访问外部的变量 但是外部不能访问内部变量 如果内部有 优先内部的 如果内部没有 就先查找外部的
  • 基于深度学习的恶意软件检测

    深度神经网络可以有效地挖掘原始数据中的潜在特征 而无需大量数据预处理和先验经验 神经网络在计算机视觉 语音识别和自然语言处理方面取得了一系列的成功 当然 成功的原因是多方面的 其中的一个因素就是神经网络具有从诸如像素或单个文本字符之类的原始
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(九)

    整理不易 希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第八章 自动化测试高级应用 第一节 自动发邮件功能 8 1 1 文件形式的邮件 8 1 2 HTML 形式的邮件 8 1 3 获取测试报告 8 1 4 整合自动发邮件功能 第
  • 数据结构中二叉树实现及部分操作

    谈二叉树之前 我们先来看看树的定义 树 由N N gt 0 个结点构成的集合 对N gt 1的树 1 有一个特殊的结点 称为根结点 根节点没有前驱结点 2 除根节点外 其余结点被分成M M gt 0 个互不相交的集合T1 T2 Tm 其中每
  • 蓝桥杯--省赛题4

    今天来看道蓝桥杯的动态规划题 题目描述 小蓝在一个 nn 行 mm 列的方格图中玩一个游戏 开始时 小蓝站在方格图的左上角 即第 11 行第 11 列 小蓝可以在方格图上走动 走动时 如果当前在第 rr 行第 cc 列 他不能走到行号比 r
  • microsoft office 卸载不了

    microsoft office 包括常用的office组件 project visio 等的卸载不是件轻松事 有可能卸载不了 右不会有任何提示 微软也知道自己的东西不好卸载 于是 提供的fix工具 office 2010 的fix工具如下
  • 【开机启动】win11开机启动软件,win11开机启动bat脚本(开机启动vbs文件)

    目录 编辑bat脚本 编辑vbs脚本 让vbs脚本开机启动 编辑bat脚本 简单介绍一下 是注释前缀 echo 是输出内容到控制台 等同于print echo off可以关闭路径显示 自己尝试写和不写就行 timeout t num num
  • 0126 线性表

    目录 2 线性表 2 1线性表的定义和基本概念 2 1部分习题 2 2线性表的顺序表示 2 2部分习题 2 3线性表的链式表示 2 3部分习题 2 线性表 2 1线性表的定义和基本概念 2 1部分习题 1 线性表是具有n个 的有限序列 A
  • 用看黑丝的时间 我搞懂了JVM内存

    JVM内存区域主要分为线程私有区域 程序计数器 虚拟机栈 本地方法区 线程共享区域 Java堆 方法区 直接内存 1 程序计数器 线程私有区域 是一块较小的内存空间 是当前线程所执行字节码的行号指示器 每条线程都有一个独立的程序计数器 如果
  • 【总结】用树形图和剪枝操作理解完全背包问题中组合数和排列数问题

    文章目录 TOC 前言 一 完全背包中的排列数和组合数问题 1 1 问题来源 1 2 两个for循环先后顺序分析 1 2 1 先遍历背包后遍历物品得到排列数 1 2 2 先遍历物品后遍历背包得到组合数 小结 前言 建议先看理清0 1背包问题