提前声明,本文为转载,但是进行了略微的加工和注释。
前言

其实不管是何种情况下,无论是一维还是二维,只要判断f[0][0]是否有意义,是否合法。即一开始什么都不做,什么要求都没有的情况。第一个0即意什么都不选,第二个0即什么要求都没有(姑且这么说)。所以,如果当什么要求都没有并且什么都不选的情况下,算是一种方案,那么f[0][0]/f[0]就该初始化为1,否则初始化为0。例如,假设数字都为非负数,当从前n个数选出若干个数字的和为m,显然当m=0时,那么什么都不选就是一种方案。不选那么m显然就是0。又例如点菜,当拥有的钱为0时,不点任何菜,显然也是一种方案。然而,实际做题会发现,很多时候f[0]=0和f[0]=1的结果竟然是一样的.....因为很多时候值都是大于1的,所以无论0和1,都会被更新掉。所以很多时候没有区别。所以感觉纠结来纠结去,如果想不清的时候,建议初始化0和1都试一下,先过样例。如果发现无差别,那就无所谓了...

蒟蒻说完了,下面看佬的分析:

0]简单介绍
至多是我们最常见的情况,通常描述为,不超过xxx

恰好以及至少是比较不常见的;

二维情况
1、体积至多j , f [ i , k ] = 0 , 0 < = i < = n , 0 < = k < = m j,f[i,k] = 0,0 <= i <= n, 0 <= k <= mj,f[i,k]=0,0<=i<=n,0<=k<=m(一般只会求价值的最大值)
2、体积恰好j jj,
当求价值的最小值:f [ 0 ] [ 0 ] = 0 f[0][0] = 0f[0][0]=0, 其余是I N F INFINF
当求价值的最大值:f [ 0 ] [ 0 ] = 0 f[0][0] = 0f[0][0]=0, 其余是− I N F -INF−INF

之所以这里f [ i ] [ 0 ] , i > 0 , f[i][0],i>0,f[i][0],i>0,不初始化为0,要看题目的,如果题目允许了0体积的物品且有价值,那就非法了;
而且,一般我们都是按顺序枚举物品的,状态会逐渐转移上去的,因此我认为没必要给f[i][0]设置合法状态,后面同理;

3、体积至少是j jj,f [ 0 ] [ 0 ] = 0 f[0][0] = 0f[0][0]=0,其余是I N F INFINF(一般只会求价值的最小值)

一维情况
1、体积至多j , f [ i ] = 0 , 0 < = i < = m j,f[i] = 0, 0 <= i <= mj,f[i]=0,0<=i<=m(只会求价值的最大值)
2、体积恰好j jj,
当求价值的最小值:f [ 0 ] = 0 f[0] = 0f[0]=0, 其余是I N F INFINF
当求价值的最大值:f [ 0 ] = 0 f[0] = 0f[0]=0, 其余是− I N F -INF−INF

3、体积至少j jj,f [ 0 ] = 0 f[0] = 0f[0]=0,其余是I N F INFINF(一般只会求价值的最小值)

稍微解释一下这些初始化;

至多的情况
也就是不超过xxx;

那么0也是不超过xxx(xxx>=0),因此初始值可以全部给0,也就是都是合法的;

恰好的情况
恰好为多少,那么只有f [ 0 ] [ 0 ] = 0 f[0][0]=0f[0][0]=0是合法的,其他都是非法状态,因此根据题意给I N F INFINF或者− I N F -INF−INF

至少的情况
因为你现在是初始状态,你不可能有比0大的合法状态,因此除了至少为0都是非法的;

故f [ 0 ] [ 0 ] = 0 f[0][0]=0f[0][0]=0,其他情况给非法状态;

求方案数
要看题意;

如果题意描述的是恰好

因为什么都不选,也是一种方案,因此方案数为1

二维 f [ 0 ] [ 0 ] = 1 f[0][0]=1f[0][0]=1

一维 f [ 0 ] = 1 f[0]=1f[0]=1

如果题意描述的是不超过

二维 f [ 0 ] [ j ] = 1 f[0][j] = 1f[0][j]=1

一维 f [ j ] = 1 f[j]=1f[j]=1

如果题意描述的是至少

二维 f [ 0 ] [ 0 ] = 1 f[0][0] = 1f[0][0]=1

一维 f [ 0 ] = 1 f[0]=1f[0]=1

具体题目

潜水员

题目来源

这道题就是至少的情况;

因为题目想要达到要求,且代价最少;

代码中有一个注意点,这里解释一下

注意这里i和j是要取到0的;

因为我们的初始状态不一定从0开始;

负数也是合法的;

举个例子,假设我们体积现在是5;

那么至少是-2也包含了体积是5;

同理,体积是10也被至少是-2包含;

因此j − w < 0 j-w<0j−w<0时的状态也是合法的;

因为在这题里;

负数和0是等价的,因此我们用0来代替负数即可;

#include <iostream>
#include <cstring>
using namespace std;const int N = 60,M = 170;int f[N][M];int main(){memset(f,0x3f,sizeof(f));int ans = f[0][0];int n,m,k;cin >> n >> m >> k;f[0][0]=0;while(k--){int w1,w2,val;cin >> w1 >> w2 >> val;//这里是注意点for(int i=n;i>=0;--i){for(int j=m;j>=0;--j){f[i][j]=min(f[i][j],f[max(0,i-w1)][max(0,j-w2)]+val);}}}cout << f[n][m] << endl;return 0;
}

278. 数字组合 - AcWing题库
这题是0-1背包求方案数,具体看代码;

#include <iostream>using namespace std;const int N = 1e3+10;int f[N];int main(){int n,m;cin >> n >> m;for(int i=0;i<=m;++i) f[i] = 0;f[0] = 1;for(int i=1,w;i<=n;++i){cin >> w;for(int j=m;j>=w;--j){f[j]+=f[j-w];}}cout << f[m] << '\n';return 0;
}

买书

这题是多重背包求方案数

买书

#include <iostream>using namespace std;const int N = 1e3+10;int f[N],a[5];int main(){int m,n=4;cin >> m;f[0]=1;a[1]=10,a[2]=20,a[3]=50,a[4]=100;for(int i=1;i<=n;++i){for(int j=a[i];j<=m;++j){f[j]+=f[j-a[i]];}}cout << f[m] << '\n';return 0;
}

原文链接  背包问题几种情况的初始化(至少、至多、恰好、求数量)_荼白777的博客-CSDN博客https://blog.csdn.net/weixin_45724872/article/details/119061764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164752222716780366594907%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164752222716780366594907&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-119061764.142%5Ev2%5Earticle_score_rank,143%5Ev4%5Econtrol&utm_term=%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96&spm=1018.2226.3001.4187

背包问题不同要求下的初始化相关推荐

  1. 为什么权重初始化要非对称?为什么权重初始化不能全为0?为什么初始化值不能太大或者太小?介绍下He初始化以及Xavier初始化?

    为什么权重初始化要非对称?为什么权重初始化不能全为0?为什么初始化值不能太大或者太小?介绍下He初始化以及Xavier初始化? 目录

  2. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  3. SD卡在SPI模式下的初始化和详细的代码分析

    SD卡在spi下的初始化: 1.初始化与SD卡链接的硬件条件(mcu的spi配置, IO口配置) 2.上电延时(>74个CLK) 3.复位卡(CMD0),进入idle状态 4.发送CMD8,检查 ...

  4. java面向对象基本概念下--继承初始化 (练习题超多超详细)

    本文内容 三大特性--继承(重点) 方法重写(重点) super关键字(重点) final修饰符(重点) 类初始化(难) 实例初始化(难) 博主将面向对象内容进行了整理 共有6篇博文下面将附上其他文章 ...

  5. windows下mysql8初始化

    去官网下载mysql的压缩包解压. 切换到 mysql/bin目录下,运行 mysqld --initialize进行mysql的初始化.或者 mysqld --initialize --user=m ...

  6. 【亲测】Parallels Desktop 16 / 17在MacOs Big Sur / Monterey下网络初始化失败:您的虚拟机将继续正常运作 解决办法

    场景: Mac升级Big Sur / Monterey后,然后再升级Parallels Desktop到16/17版本后,Parallels Desktop开启windows或者其他虚拟机就出现 网络 ...

  7. Parallels Desktop 16在Big Sur下网络初始化失败解决办法

    前几天mac最新的操作系统 Big Sur 已经发布,目前可以正式下载并安装macOS Big Sur 11.0系统,但是有些网友会不知道软件兼容性如何,特别是 Parallels Desktop 虚 ...

  8. Linux下mysql初始化失败

    报错信息:......the data directory has files in it. Aborting. 显示已经产生数据 1.vim /etc/my.cnf 找到:datadir=/var/ ...

  9. Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化...

    上接深入java虚拟机--深入java虚拟机(二)--类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...

最新文章

  1. 无线节能组的充电问题
  2. iOS quartzCore学习之UIBezierPath 详解
  3. 奇小葩讲设备树(5/5)-- Linux设备树详解(五)设备树的使用
  4. 【ZOJ - 2968 】Difference Game (贪心,思维模拟)
  5. 求出2个字符串中的最大公共子串
  6. 01-二维数组中的查找
  7. java把对象放入数组_如何将对象添加到数组
  8. Java SSH远程执行Shell脚本实现
  9. 熟悉常规B/S、C/S系统开发实现原理
  10. Extjs GridPanel用法详解
  11. 台电tbook10s官方固件_台电TbooK 10 S (E5N5)-双系统平板电脑固件
  12. NCL绘制色斑图-多要素叠加
  13. 模拟汽车速度控制系统的设计 微机原理课程设计
  14. 前端基础:通过 《砸金蛋》小游戏实践CSS的id选择器和class选择器
  15. BUUCTF中的reverse1
  16. 五大学科竞赛(四)信息学奥赛试题
  17. C++新特性:override
  18. 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办
  19. Linux命令操作——常用解压缩命令
  20. devops学习(十) Jenkins 流水线

热门文章

  1. MOSFet 的类型和区别:NP沟道,增强耗尽
  2. wordpress主题_选择完美的WordPress主题–您应该考虑的9件事
  3. Win10桌面布局-透明剧中任务栏
  4. 英才计划计算机潜质测评试题,2018年“英才计划”综合实践活动通知
  5. 人工智能写作的春天来了 除了写作, 人工智能还能写诗、画画
  6. 基于深度学习的花卉检测与识别系统(YOLOv5清新界面版,Python代码)
  7. Linux 打包压缩-文件打包-打包工具【tar】命令使用简介
  8. 受用一生的心理寓言(转)
  9. manjaro pacman glibc 2.33 not fount
  10. SQL Server数据恢复准备之TRUNCATE TABLE理解