背包问题,硬币问题

2023-10-27

至少有4种背包问题:1)01背包 2)  部分背包 3)完全背包 4)多重背包。只有部分背包是个贪心问题,其他的都是以01背包为基础的动归问题。

部分背包问题:

把物品按价值密度从大到小排序(W[i]/V[i]),然后从第一种物品开始,尽可能多拿当前物品,如果当前物品的量小于背包剩余容量,拿完,指针推到下一种物品;否则拿背包剩余容量的量,结束。

01背包问题

递推式:f(i,j )= max ( f(i-1, j), f(i-1, j-V[i])+W[i]),i定义为前i个物品,j为当前背包剩余容量。当前状态只跟上一行相同列和一个前面的列有关,滚动数组逆序求解。滚动数组初始值代表拿0个物品,不管背包容量是多少价值都是0,所以初始化全是0,行循环下界从1开始。列的计算也是从1开始,因为第0列代表容量为零,一个物品都放不下,价值必然是0,进一步的优化是从V[i]开始,因为背包容量小于V[i]的时候,当前物品i必然没办法拿,只能是f(i-1, j) 即保持上一行的状态。复杂度分析:二维动归,状态是二维的,遍历所有状态是O(N*C),计算每个状态的开销是O(1),总的复杂度是O(N*C)。


完全背包问题

每个物品不是取还是不取,而是可以取任意次数。

思路1:虽说可以取任意次,实际上每个物品可取的次数有个上限,即C/V[i]。一个物品可拿C/V[i]次可以分割为C/V[i]个只能拿一次的相同物品,转换为0,1背包。O(N' *C)

思路2:直接扩展0,1背包的思路,从2种选择(0,1)扩展到 C/V[i]种选择(0,1,2,...C/V[i])。递推式:f(i,j) = max{ f(i-1, j - k* V[i]) + k * W[i] } k=0,1,.., C/V[i]。滚动数组依然是逆序求解。复杂度分析:遍历二维状态 是O(N*C),计算每个状态是O(C/V[i]),总得复杂度是O(NC*C/V[i])

思路3:递推式:f(i, j) = max ( f(i-1, j), f(i, j - V[i]) + W[i]) 这个递推式和01背包的递推式很像,只是max里的第二项是本行的状态。递推式的含义不是按当前物品拿几次划分,而是另一种划分和解释:用前i-1个物品装容量j的最大价值,和用前i个物品,先装最大 j- V[i]的容量,然后再装一个物品i的价值,二者的大者。划分的角度是用不用到前i个物品。注意这里f的定义和01背包就不同:f(i,j)的定义是,用前i个物品,每个物品不限次数,装到容量为j的背包的最大价值。滚动数组求解是正序的。正序和逆序的区别就是,对于正序,j以前的状态是当前行的状态;对于逆序,j以前的状态是上一个行的状态。复杂度分析:遍历二维状态O(N*C),计算状态O(1),总的复杂度是O(N*C)。

思路4:直接递归的思路。考察在装任意一个物品之后面临的问题,仍然可以从n中物品中任意选择,这个条件没有变化,只是背包容量变小了,也就是说装了任意一个物品之后的面临的问题是和原问题相同的问题,只是规模变小了,这就是递归。而且仅仅是背包容量这一个维度变小了,是一维递归。反观01背包,在装一个物品之后面临的问题,不仅仅是原问题背包容量变小之后的子问题,因为问题其他条件也变了,有一个物品不能选了,必须把这个变量也作为递归变量,是二维递归。直接递归法下的完全背包问题递推式:f(j) = max { f(j- V[i]) + W[i] }, i= 1,..., n and V[i]<=C 。解释是,先取一个,然后解决剩下的问题,经典的递归、分治思想,先让规模减小一步,然后解决规模变小了的相同问题。

多重背包问题

每个物品取的次数有限制,输入多一个数组num[n]。

思路1:次数转化成物品数,变成01背包问题。

思路2:扩展01背包问题,第i个物品分别拿0到num[i]次,还要满足j-num[i] * V[i]>0


背包问题变种:硬币问题

其实01背包问题的模型是相对复杂的,输入是一两个数组,一个cost数组,一个价值数组,还有一个总cost上限,求价值最大化的值。

变种1:最少硬币问题。给定一个硬币面额集合和一个金额,求最怎样用最少的硬币凑成这个金额?输入比背包问题少一个数组,问题不如背包问题复杂。用背包问题的元素翻译一下:给定一组物体的体积,求装满一个给定容量背包所用物品的最少个数,每个物品可以任意取。

递推式:f( j) = min { 1+ f(j-V[i-1]) } i= 1,.., n and V[i-1]<= j,先分别取一个每一个可以取的硬币(面额小于给定的金额),然后递归解决金额变小了的子问题,得到分别先取每一个硬币的取法的最小硬币数,然后取最小的。

思路2:完全背包,f(i, j) = min( f(i-1, j), f(i, j - v[i-1])) 

变种2:方案数问题,给定一个硬币面额集合和一个金额,求用这面额的硬币凑成这个金额的方案数。

递归思路:完全背包:不取第i种面额的方案数+ 取第i种面额的方案数。递推式:f(i, j) = f(i-1, j) + f(i, j - v[i - 1])

变种3:给定n种硬币,从中取k个,求方案数。

思路:和上一题是一样的,只不过背包体积换成背包可以装的个数,每一个物品的体积cost变为数目cost为1,完全背包问题: f[i][j] = f[i][j-1] + f[i-1][j]




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

背包问题,硬币问题 的相关文章

  • ACwing :01背包问题

    朴素的 动规的 基本表示 f i j 表示只看前 i 个物品 总体积是 j 的情况下 总价值最大是多少 result max f n 0 V f i j 1 不选第 i 个物品 f i j f i 1 j 2 选第 i个物品 f i j f
  • Codeforces Round #291 (Div. 2)

    题目链接contest 514 A Chewba ca and Number 不允许有前导零 所以如果第一位是9的话 需要特别考虑 一开始理解错了题意 又WA了呜呜呜 include
  • 计蒜客 17319 The Heaviest Non-decreasing Subsequence Problem

    Problem nanti jisuanke com t 17319 Meaning 给一个整数序列 s 每个数都有个权值 权值的计算方法是 s i lt 0 s i 的权值为 0 s i gt 10000 s i 的权值为 5 且 s i
  • 还是搜索、索引的问题

    搜索要弄清2个基本问题 1 要搜索出什么类型的entity 2 entity的哪个方面 维度和关键词发生关联的 一般来说可以有多个角度link到entity 一个entity支持多个索引 可以从不同的column检索 对于 web sear
  • poj 1742 Coins

    Problem poj org problem id 1742 Reference www cppblog com flyinghearts archive 2010 09 01 125555 html blog csdn net wang
  • 最大公约数,最小公倍数,素数等问题

    1 两个数的 最小公倍数 等于两个数的乘积除以最大公约数 scm a b a b gcd a b 所以主要是最大公约数问题 gcd 问题 辗转相除法 依据就是欧几里得定理 gcd a b gcd b a b def gcd a b whil
  • 最长01交替子串(浪潮笔试题)

    题意 给一个只有0和1的字符串 允许反转一个连续区间 即0变成1 1变成0 求最长的01交替串多长 允许不连续 我最先想到的是动态规划解法 状态设计方面 首先一个串的状态会有以0结尾和以1结尾两种 然后题目中说允许反转一个连续区间 那么根据
  • 蓝桥杯--砝码称重(dp)

    砝码称重 题目评测 你有一架天平和 N 个砝码 这 N 个砝码重量依次是 W1 W2 WN 请你计算一共可以称出多少种不同的正整数重量 注意砝码可以放在天平两边 输入格式 输入的第一行包含一个整数 N 第二行包含 N 个整数 W1 W2 W
  • 算法的三种练习

    除了具体写代码 做这些练习 1 循环不变式 用循环不变式去解释算法 2 递归 动归的 递推式 3 搜索问题的隐式图构造 隐式树还是图 一个前驱 多个前驱 点是什么 边是什么 怎么扩展
  • hdoj-1069-Monkey and Banana【动态规划】

    Monkey and Banana Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 9489 Acc
  • 最少砝码问题(用一部分数的和/差表示区间上所有的整数)

    问题1 需要表示 1 N 的所有重量 最少需要多少砝码 答案 需要 1 2 4 ceiling logN 每个砝码代表二进制数的一位 N有ceiling logN 个二进制位 问题2 需要表示 1 N 的所有重量 手头已有一些砝码 问 怎样
  • 再谈type ahead 问题

    问题 给定一个词典 包括一些词和其出现的频率 实现type ahead功能 要求用户每键入一个字符 下拉框显示以当前输入为前缀的前10个最热门的词 解法1 用不带data的Trie data仅仅是词频 实时查询法 需要实时的去build h
  • 砝码称重问题【dp】

    设有 1g 2g 3g 5g 10g 20g 的砝码各若干枚 其 总重 1000g 要 求 输入 a1 a2 a3 a4 a5 a6 表示 1g 砝码有 a1 个 2g 砝码有 a2 个 20g 砝码有 a6 个 输出 Total N N
  • 打表法经典2题:小于n的质数和第k个丑数

    1 求小于n的所有质数 1 开一个大小为n的bool数组A 下标代表整数 值true代表被mark过 有因子 非素数 2 i 从 2开始到n 1 如果A i 没被mark A i 就是质数 然后mark有A i 因子的数 2 A i 3 A
  • Economic Difficulties【DP】【Codeforces 1263 F】

    Codeforces Round 603 Div 2 F 题意 给你两棵树 结点分别是1 A与1 B 然后给了N台设备 并且A树和B树的叶子结点都是链接设备的 问的是 我们最多可以割几条边使得每个设备都能链接A树或者B树上任意的一个 1 号
  • 16.4 线性DP练习——【字符串转换】

    文章目录 题目描述 输入描述 输出描述 输入输出样例 最终代码c c 过程理解 题目描述 小蓝拥有两个字符串S T 他希望通过如下操作使得字符S转换为字符串T 操作有一下三种 删除一个字符 插入一个字符 将一个字符改为另一个字符 问最少需要
  • 动态规划问题——最长上升子序列(LIS)(一)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 二 动态规划问题 最长上升子序列 LIS 三 如 求 2 7 1 5 6 4 3 8 9 的最长上升子序列 我们定义d i i 1 n 来表示前i个数以A
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • 数组双指针法汇总

    指针移动方向 相向夹逼 同向移动 维护的是一个区间还是只是关心指针指向的两个元素 同向移动的 维护一个区间的双指针法即滑动窗口法 2Sum 排序后两头往中间夹逼的双指针法 指针为什么可以不回退 即为什么可以i只 j只 当A i A j
  • 插入数计数类 / 转为换行类dp:AT_agc024_e

    https www luogu com cn problem AT agc024 e 首先题目可以转化成每次插入一个数 满足字典序递增 如果只考虑暴力dfs 先别上dp 想想怎么合法和不算重 合法 也就是插入数有3种情况 插到末尾 插到比他

随机推荐

  • 十分钟弄懂最快的APP自动化工具uiautomator2(入门到精通)

    目录 导读 前言 一 介绍 二 环境部署 三 编写百度贴吧首页脚本 四 uiautomator2和appium运行速度比较 前言 相信很多使用appium做过APP自动化的人都深有感触 appium运行慢 时间长 uiautomatorvi
  • 批量将csv转换成shp

    转载 https blog csdn net u012131430 article details 90105857 根据自己的需求 对代码进行适当修改 并可以实现 输入数据 一个文件夹下所有csv数据 输出数据 一个文件夹下shp文件 具
  • Python 进阶(三):邮件的发送与收取

    1 发送邮件 SMTP 全称 Simple Mail Transfer Protocol 中文译为简单邮件传输协议 它能跨越网络传输邮件 可实现相同网络处理进程之间的邮件传输 也可通过中继器或网关实现进程与其他网络之间的邮件传输 Pytho
  • 查看svn账号密码

    参考他人链接 https blog csdn net Amnesiac666 article details 121355958 1 找到svn存放目录 窝的本地 C Users lenovo AppData Roaming Subvers
  • 编写高质量代码:改善Java程序的151个建议(第9章:多线程和并发___建议118~124)

    多线程技术可以更好地利用系统资源 减少用户的响应时间 提高系统的性能和效率 但同时也增加了系统的复杂性和运维难度 特别是在高并发 大压力 高可靠性的项目中 线程资源的同步 抢占 互斥都需要谨慎考虑 以避免产生性能损耗和线程死锁 建议118
  • TOPSIS算法与熵权法

    TOPSIS算法 英文全称Technique for Order Preference by Similarity to Ideal Solution 翻译为逼近理想解排序法 使用层次分析法进行评价时 n不能很大 最多就15个 再多就没有随
  • GPT,GPT-2,GPT-3,InstructGPT的进化之路

    ChatGPT 火遍圈内外 突然之间 好多人开始想要了解 NLP 这个领域 想知道 ChatGPT 到底是个什么 作为在这个行业奋斗5年的从业者 真的很开心让人们知道有一群人在干着这么样的一件事情 这也是我结合各位大佬的文章 总结下GPT
  • Encode and Decode TinyURL

    TinyURL is a URL shortening service where you enter a URL such as https leetcode com problems design tinyurl and it retu
  • 服务器运维基础知识,IDC机房服务器运维基础知识

    机房的服务器的维护是机房运维工作的重点 合理的机房环境对于服务器来说是非常的重要的 随着这年经济的发展 机房也在不断的在很多的方面进行调整 今天我们学习IDC机房服务器运维基础知识 1 关于电力 1 定期检测机房内市电及 UPS 电源是否稳
  • 目标跟踪检测算法(二)——检测与跟踪

    第二阶段 2010年 2012年 检测与跟踪相结合的方法出现 在该阶段 对已存的目标追踪算法出现了两种比较公认的分类 一种是基于生成模型的方法 一种是基于判别模型的方法 在第一阶段中的方法都属于前一种 而基于判别的方法是指通过分类来做跟踪
  • 深入梯度下降(Gradient Descent)

    深入梯度下降 Gradient Descent 算法 1 问题的引出 对于吴恩达的线性回归 先化一个为一个特征 1 0为偏置项 最后列出的误差函数如下图所示 手动求解 目标是优化J 1 其实就是神经网络里面的loss函数 使得loss值最小
  • 事件响应步骤:安全响应的6个步骤

    当发生安全事件时 每一秒都很重要 恶意软件感染迅速蔓延 勒索软件可能造成灾难性破坏 被破坏的帐户可用于特权升级 从而使攻击者获得更敏感的资产 无论您的组织规模大小 您都应该拥有一支训练有素的事件响应团队 负责在事件发生时立即采取行动 请继续
  • 关于vue中的Pinia的介绍

    Pinia是什么 Pinia是vue的专属状态库 允许开发者跨组件或页面共享状态 他是一个拥有组合式API的Vue状态管理库 支持vue2和vue3 有三个概念 state getter 和 action 我们可以假设这些概念相当于组件中的
  • (c语言)输入两个数字,分别计算并输出这两个数字的和、差、乘积、商

    include
  • 【机器学习 - 3】:数据归一化(最值归一化、均值方差归一化)

    文章目录 数据归一化的使用 最值归一化 均值方差归一化 常用 在sklearn中调用归一化 鸢尾花数据归一化 数据归一化的使用 为什么要使用数据归一化 举个例子 例如我们要使用KNN算法来预测肿瘤为良性肿瘤或恶性肿瘤 以下是一些数据 肿瘤大
  • JetBrains IntelliJ IDEA 20191.1中文版

    JetBrains IntelliJ IDEA 20191 1中文版推荐给大家 JetBrains IntelliJ IDEA 20191 1版本更新 修复了几个重要的修复程序 例如 KT 30117 KT 29427 KT 30137和K
  • 八大常用排序

    目录 前言 一 插入排序 二 希尔排序 三 选择排序 四 堆排序 五 冒泡排序 六 快速排序 七 归并排序 八 计数排序 九 稳定性 前言 此篇博客都是以升序为例 降序只需更改部分地方即可 所以只排一个 一 插入排序 单趟排序 如上图 在一
  • JAVA IO流综合案例

    需求 d aaa 3 jpg 复制到 d bbb 1 jpg 思路分析 先读去3 jpg 然后读的同时写入1 jpg package com yang import java io 需求 d aaa 3 jpg 复制到 d bbb 1 jp
  • 【CyberSecurityLearning 40】网络地址配置(Kali/CentOS)

    目录 一 关闭networkmanager服务 二 查看IP 三 配置IP 路由 DNS kali设置root用户登录 一 关闭networkmanager服务 因为这个 小电脑 开启后会替你管理网络 帮你去配 只要它开着会产生很多副作用
  • 背包问题,硬币问题

    至少有4种背包问题 1 01背包 2 部分背包 3 完全背包 4 多重背包 只有部分背包是个贪心问题 其他的都是以01背包为基础的动归问题 部分背包问题 把物品按价值密度从大到小排序 W i V i 然后从第一种物品开始 尽可能多拿当前物品