news 2026/6/8 18:10:49

GESP6级C++考试语法知识(五十四、动态规划----背包问题(七、方案数背包)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GESP6级C++考试语法知识(五十四、动态规划----背包问题(七、方案数背包)


第七课《背包里的数学魔法——方案数背包》


🎒故事开始:宝藏猎人的新任务

经过前面的学习,阿宝已经学会了:

✅ 01背包

求最大价值

✅ 完全背包

求最大价值

✅ 多重背包

求最大价值

✅ 分组背包

求最大价值


1、阿宝发现:

以前所有背包题都在问:

能获得多少价值?

或者:

最大价值是多少?


2、例如:

宝物重量价值
金币23
钻石35

问:

最大价值是多少?

3、这种题目,

DP数组里存的是:

最大价值

4、可是有一天。

国王又出了一个奇怪的问题。


5、👑国王的问题

(1) 仓库里有:

宝物重量
红宝石1
蓝宝石2
绿宝石3

背包容量:

4

(2) 国王问:

阿宝!

容量恰好装满4,

一共有多少种装法?


6、阿宝愣住了。


因为这次:

不是问:

价值最大是多少

而是问:

有多少种方案

🌟方案数背包登场


第一幕:什么叫方案数?

1、先看例子。


(1)宝石:

编号重量
11
22
33

(2)容量:

4

2、看看有哪些装法。


方案1:

1 + 3

重量:

1+3=4

成功


方案2:

只有4重量的宝石?

没有


方案3:

2 + 2

不行

因为每个宝石只有一个。


3、所以:

只有

1+3

这一种。


答案:

1

第二幕:DP存什么?

1、以前:

dp[j]

表示:

最大价值

2、现在:

dp[j]

表示:

凑出重量j的方法数

3、注意!

这里发生了巨大变化。


4、🌟以前存价值

dp[j]=100

意思:

最大价值100

5、🌟现在存方案数

dp[j]=100

意思:

有100种方法

第三幕:最重要的初始化

1、这里最容易错!


2、先问大家:

凑出重量0

有多少种方法?


3、很多同学说:

0种


4、其实:

什么都不选

就是一种方法!


5、所以:

dp[0]=1;

这是方案数背包的基础!


6、🌟记住

dp[0]=1

表示:

空方案

第四幕:状态转移

1、还是01背包的方法。


(1)宝石:

w[i]

(2)如果当前重量:

j

(3)选这个宝石:

会从哪里转移来?


(4)当然是:

j-w[i]

2、例如:

重量3的宝石。


想凑出:

5

那么之前必须先凑出:

2

3、因此:

dp[5] += dp[2]

4、🌟方案数转移

dp[j] += dp[j-w[i]]

5、注意不是:

max()

了!


因为:

方案数要累加。


第五幕:手算例子

1、宝石:

重量
1
2
3

2、容量:

4

3、初始化:

dp[0]=1

4、数组:

重量01234
初始10000

5、处理重量1

倒序:

for(j=4;j>=1;j--)

更新:

dp[1]+=dp[0]

得到:

重量01234
状态11000

6、处理重量2

更新:

dp[3]+=dp[1]

得到:

1

更新:

dp[2]+=dp[0]

得到:

1

数组:

重量01234
状态11110

7、处理重量3

更新:

dp[4]+=dp[1]

因为:

dp[1]=1

所以:

dp[4]=1

8、最终:

重量01234
状态11121

答案:

dp[4] = 1

只有一种方案:

1+3

第六幕:为什么是加法?

1、以前:

最大价值


只能保留:

最大的

所以是:

max()

2、现在:

方案数


每种方法都算。


例如:

凑出4的方法。


方法A:

1+3

方法B:

2+2

(如果允许的话)


总方案数:

2

因此:

+ =

第七幕:完整代码(01背包方案数)

1、输入:

物品数 容量 每个物品重量

2、例如:

3 4 1 2 3

3、程序:

#include <iostream> using namespace std; int main() { int n,m; cin>>n>>m; int w[105]; for(int i=1;i<=n;i++) { cin>>w[i]; } long long dp[10005]={0}; dp[0]=1; for(int i=1;i<=n;i++) { for(int j=m;j>=w[i];j--) { dp[j] += dp[j-w[i]]; } } cout<<dp[m]<<endl; return 0; }

第八幕:完全背包方案数

1、如果物品无限使用呢?


例如:

硬币:

1元 2元

无限个


问:

组成4元有多少种方法?


2、这时:

转移仍然是:

dp[j] += dp[j-w]

3、区别只有一个:

正序循环

for(j=w;j<=m;j++)

因为:

完全背包允许重复使用。


第九幕:背包家族大集合

类型求什么转移
01背包最大价值max
完全背包最大价值max
多重背包最大价值max
分组背包最大价值max
方案数背包方案数量+=

发现了吗?


1、前面:

max()

家族


2、现在:

+=

家族


第十幕:方案数背包的经典应用

生活中非常常见。


1、硬币问题

1元

2元

5元


组成10元:

多少种方案?

2、选课问题

课程学分:

2 3 4

凑满:

10学分

多少种选法?


3、糖果问题

不同糖果重量。


装满袋子:

多少种装法?

全部都是:

🌟方案数背包


🎯本课总结


1、状态定义

dp[j]

表示:

凑出重量j的方法数

2、初始化

最重要:

dp[0]=1;

表示:

空方案

3、转移

dp[j] += dp[j-w[i]];

不是:

max()

是:

+=

4、01方案数背包

for(j=m;j>=w[i];j--)

倒序


5、完全方案数背包

for(j=w[i];j<=m;j++)

正序


6、🌟终极口诀

价值背包求最优, 状态转移用max。 方案背包数方法, 状态转移改加法。 dp[0]最为重要, 空方案要记牢!

🏹课后挑战

1、有4块魔法石:

重量
1
2
3
4

2、背包容量:

5

3、请同学们:

① 求恰好装满5有多少种方案。

② 画出完整DP数组变化过程。

③ 找出每一种具体方案。

当你能够自己列出所有方案,并且能解释为什么程序得到同样的答案时,你就真正掌握了方案数背包的核心思想!🏆✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 18:06:12

Adafruit-Pi-Finder背后的技术:ARP扫描与网络检测实现原理

Adafruit-Pi-Finder背后的技术&#xff1a;ARP扫描与网络检测实现原理 【免费下载链接】Adafruit-Pi-Finder Find and set up your brand new Raspberry Pi 项目地址: https://gitcode.com/gh_mirrors/ad/Adafruit-Pi-Finder Adafruit-Pi-Finder是一款专为Raspberry Pi设…

作者头像 李华
网站建设 2026/6/8 18:05:51

Codex第三方API切换为官方登录配置

错误信息&#xff08;第三方API to CHatGPT用户登录&#xff09;&#xff1a;unexpected status 401 Unauthorized: {"error":"Invalid API key"}, url: https://blackaicoding.com/v1/responses, cf-ray: a08429cc2c69c48f-ORD 问题分析&#xff1a; htt…

作者头像 李华
网站建设 2026/6/8 18:00:41

MC68HC912B32 Flash引导加载器设计:串口固件升级与S-Record协议解析

1. 项目概述与核心价值在嵌入式产品开发与维护的生命周期中&#xff0c;固件升级是一个绕不开的环节。想象一下&#xff0c;产品已经部署到成千上万的现场&#xff0c;这时发现了一个需要修复的Bug&#xff0c;或者需要增加一个新功能。如果每个设备都需要拆机、取下芯片、用专…

作者头像 李华
网站建设 2026/6/8 17:59:24

【花雕动手做】行空板K10系列实验之网络服务查询本地天气情况

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板&#xff0c;100%采用国产芯片&#xff0c;知识产权自主可控&#xff0c;符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、…

作者头像 李华
网站建设 2026/6/8 17:59:22

如何快速解决Windows运行库问题:智能修复工具完整指南

如何快速解决Windows运行库问题&#xff1a;智能修复工具完整指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在打开游戏或软件时遇到"找不到…

作者头像 李华