动态规划<八> 完全背包问题及其余背包问题

目录

例题引入---找到解决问题模版

LeetCode 经典OJ题

1.第一题

 2.第二题

 3.第三题

 其余的一些背包问题

1.二维费用的背包问题


例题引入---找到解决问题模版

OJ 传送门 牛客 DP42 【模板】完全背包

画图分析:

 使用动态规划解决(第二问与第一问的不同之处用绿色来标记)

1.状态表示

dp[i][j]表示从前i个物品中挑选,总体积不超过j的所有选法中,所挑选出来的最大价值

dp[i][j]表示从前i个物品中挑选,总体积等于j的所有选法中,所挑选出来的最大价值

2.状态转移方程

3.初始化  根据01背包问题得知,我们只需初始化第一行即可

4.填表顺序   从上往下填每一行,每一行从左往右

5.返回值  对于第一问的是直接返回dp[n][V]

第二问则是需要判断下dp[n][V]==-1?0:dp[n][V] 

具体代码   ---优化前

#include <iostream>
#include <string.h>
using namespace std;
const int N=1010;
int n,V;
int w[N],v[N],dp[N][N];
int main()
{//读入数据cin>>n>>V;for(int i=1;i<=n;++i)cin>>v[i]>>w[i];//解决第一问for(int i=1;i<=n;++i)for(int j=0;j<=V;++j){dp[i][j]=dp[i-1][j];if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);}cout<<dp[n][V]<<endl;//解决第二问memset(dp,0,sizeof dp);for(int j=1;j<=V;++j) dp[0][j]=-1;for(int i=1;i<=n;++i)for(int j=0;j<=V;++j){dp[i][j]=dp[i-1][j];if(j>=v[i] && dp[i][j-v[i]]!=-1) dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);}cout<<(dp[n][V]==-1? 0:dp[n][V]);return 0;
}

做优化

优化后的代码

#include <iostream>
#include <string.h>
using namespace std;
const int N=1010;
int n,V;
int w[N],v[N],dp[N];
int main()
{//读入数据cin>>n>>V;for(int i=1;i<=n;++i)cin>>v[i]>>w[i];//解决第一问for(int i=1;i<=n;++i)for(int j=v[i];j<=V;++j){dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}cout<<dp[V]<<endl;//解决第二问memset(dp,0,sizeof dp);for(int j=1;j<=V;++j) dp[j]=-1;for(int i=1;i<=n;++i)for(int j=v[i];j<=V;++j){if(dp[j-v[i]]!=-1) dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}cout<<(dp[V]==-1? 0:dp[V]);return 0;
}

LeetCode 经典OJ题

1.第一题

OJ 传送门 LeetCode<322> 零钱兑换

画图分析:

 使用动态规划解决

1.状态表示

dp[i][j]表示从前i个硬币中挑选,总和正好等于j,所有的选法中,最少的硬币数

2.状态转移方程

3.初始化

4.填表顺序  从上往下每一行,每一行从左往右

5.返回值   dp[n][amount]>=INF? -1:dp[][amount]

具体代码

 int coinChange(vector<int>& coins, int amount) {const const int INF=0x3f3f3f3f;int n=coins.size();vector<vector<int>> dp(n+1,vector<int>(amount+1));for(int j=1;j<=amount;++j) dp[0][j]=INF;for(int i=1;i<=n;++i)for(int j=0;j<=amount;++j){dp[i][j]=dp[i-1][j];if(j>=coins[i-1]) dp[i][j]=min(dp[i][j],dp[i][j-coins[i-1]]+1);}return dp[n][amount]>=INF? -1:dp[n][amount];}//优化后int coinChange(vector<int>& coins, int amount) {const const int INF=0x3f3f3f3f;int n=coins.size();vector<int>dp(amount+1,INF);dp[0]=0;for(int i=1;i<=n;++i)for(int j=coins[i-1];j<=amount;++j)dp[j]=min(dp[j],dp[j-coins[i-1]]+1);return dp[amount]>=INF? -1:dp[amount];}

 2.第二题

OJ 传送门 LeetCode<518> 零钱兑换II

画图分析:

 使用动态规划解决

1.状态表示

dp[i][j]表示从前i个硬币中挑选,总和正好等于j,一共有多少种选法

2.状态转移方程

3.初始化 初始化第一行,第一个位置前0个凑出0元,即什么都不选,是一种方法,初始化为1,其余位置是凑不出来的,即初始化为0

4.填表顺序   从上往下每一行,每一行从左往右

5.返回值   dp[n][amount]

具体代码 

int change(int amount, vector<int>& coins) {vector<unsigned int> dp(amount + 1); dp[0] = 1; for(int i=1;i<=coins.size();++i) for(int j = coins[i-1]; j <= amount; j++) dp[j] += dp[j - coins[i-1]];return dp[amount];}

 3.第三题

OJ 传送门 LeetCode<279> 完全平方数

 画图分析:

对于本题可以从左往右进行挑选完全平方数,来合成数n,且每个完全平方数都能重复进行选择

这就是完全背包问题 使用动态规划解决

1.状态表示

dp[i][j]表示从前i个完全平方数中进行挑选,总和恰好为j,完全平方数的数量

2.状态转移方程

3.初始化  初始化第一行,第一个位置初始化为0,其余位置的状态是不存在的,因为题目求的是min,为不影响填表,初始化为一个较大值ox3f3f3f3f

4.填表顺序  从上往下,从左往右

5.返回值 dp[sqrt(n)][n]

具体代码:

int numSquares(int n) {int m=sqrt(n);vector<vector<int>> dp(m+1,vector<int>(n+1));for(int j=1;j<=n;++j) dp[0][j]=0x3f3f3f3f;for(int i=1;i<=m;++i)for(int j=0;j<=n;++j){dp[i][j]=dp[i-1][j];if(j>=i*i) dp[i][j]=min(dp[i][j],dp[i][j-i*i]+1);}return dp[m][n];}//优化后int numSquares(int n) {int m=sqrt(n);vector<int>dp(n+1,0x3f3f3f3f);dp[0]=0;for(int i=1;i<=m;++i)for(int j=i*i;j<=n;++j){dp[j]=min(dp[j],dp[j-i*i]+1);}return dp[n];}

 其余的一些背包问题

1.二维费用的背包问题

二位费用的背包问题简单来说就是指有两个限定条件的背包问题

OJ 传送门 LeetCode<474>一和零

画图分析

 本题目简单来说,就是从数组中挑选字符串,挑出来的字符串要共同满足1和0 的最多出现次数的条件,因此是一个背包问题,且要满足两个条件,因此是二维费用的背包问题

使用动态规划解决

1.状态表示

dp[i][j][k]表示从前i个字符串中挑选,字符0的个数不超过j,字符1的个数不超过k,所有的选法中最大的长度

2.状态转移方程

3.初始化  对于三维的也一样,仅需初始化关于i=0的这些数据,根据状态表示,都初始化为1

4.填表顺序    i从小到大

5.返回值       dp[len][m][n]

具体代码

int findMaxForm(vector<string>& strs, int m, int n) {int len=strs.size();vector<vector<vector<int>>>dp(len+1,vector<vector<int>>(m+1,vector<int>(n+1)));for(int i=1;i<=len;++i){//统计字符串中0 1的个数int a=0,b=0;for(auto ch:strs[i-1]){if(ch=='0') ++a;else ++b;}for(int j=0;j<=m;++j){for(int k=0;k<=n;++k){dp[i][j][k]=dp[i-1][j][k];if(j>=a && k>=b) dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-a][k-b]+1);}}}return dp[len][m][n];}//优化
int findMaxForm(vector<string>& strs, int m, int n) {int len=strs.size();vector<vector<int>>dp(m+1,vector<int>(n+1));for(int i=1;i<=len;++i){//统计字符串中0 1的个数int a=0,b=0;for(auto ch:strs[i-1]){if(ch=='0') ++a;else ++b;}for(int j=m;j>=a;--j)//从大到小{for(int k=n;k>=b;--k){dp[j][k]=max(dp[j][k],dp[j-a][k-b]+1);}}}return dp[m][n];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TP8 前后端跨域访问请求API接口解决办法

报错&#xff1a;Access to XMLHttpRequest at http://www.e.com/api/v1.index/index?t1735897901267 from origin http://127.0.0.1:5500 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: The value of the Access-Contr…

【前端系列】Pinia状态管理库

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、Pinia状态管理库&#xff1a;☀️☀️☀️2.1 pinia基本使用① pinia充当中转站存放token② 使用步骤 2.1 axios请求拦截器 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;…

打造三甲医院人工智能矩阵新引擎(四):医疗趋势预测大模型篇 EpiForecast与DeepHealthNet合成应用

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗领域积累了海量的数据,涵盖电子病历、医学影像、基因序列、临床检验结果等多源异构信息。这些数据蕴含着疾病发生发展、治疗反应、疫情传播等规律,为医疗趋势预测提供了数据基础。准确的医疗趋势预测能辅助医疗机构提前…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

OFDM学习-(二)长短序列和PPDU整体数据处理流程

OFDM学习 &#xff08;二&#xff09;长短序列和PPDU整体数据处理流程 OFDM学习前言一、短序列短序列的作用 二、长序列三、PLCP/SIGNAL/DATA数据处理流程三、fpga实现STS模块LTS模块训练序列模块仿真波形 总结 前言 根据框图可以知道发射机这部分信号在DA转换之前&#xff0c…

leetcode 173.二叉搜索树迭代器栈绝妙思路

以上算法题中一个比较好的实现思路就是利用栈来进行实现&#xff0c;以下方法三就是利用栈来进行实现的&#xff0c;思路很好&#xff0c;很简练。进行next的时候&#xff0c;先是一直拿到左边的子树&#xff0c;直到null为止&#xff0c;这一步比较好思考一点&#xff0c;下一…

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…

kubernetes学习-kubectl命令、探针(二)

一、在任意节点使用 kubectl # 在master节点获取节点信息 [rootk8s-master k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 16h v1.23.6 k8s-node1 Ready <none> …

关于IDE的相关知识之三【插件安装、配置及推荐的意义】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件安装、配置及推荐意义的相关内容…

Node 如何生成 RSA 公钥私钥对

一、引入crypto模块 crypto 为node 自带模块&#xff0c;无需安装 const crypto require(crypto);二、封装生成方法 async function generateRSAKeyPair() {return new Promise((resolve, reject) > {crypto.generateKeyPair(rsa, {modulusLength: 2048, // 密钥长度为 …

数字PWM直流调速系统设计(论文+源码)

2.1 系统方案设计 2.2.1开环控制方案 采用开环方案的系统架构如图2.1所示&#xff0c;这种方式不需要对直流电机的转速进行检测&#xff0c;在速度控制时单片机只需要直接发出PWM就可以实现直流电机速度的控制。这种方式整体设计难度较低&#xff0c;但是无法准确得知当前的…

w~多模态~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663226 #Vista-LLaMA Vista-LLaMA 在处理长视频内容方面的显著优势&#xff0c;为视频分析领域带来了新的解决框架。AI解读视频张口就来&#xff1f;这种「幻觉」难题给解决了 近年来&#xff0c;大型语言模型如 GPT、…

2025年第五届控制理论与应用国际会议 | Ei Scopus双检索

会议简介 Brief Introduction 2025年第五届控制理论与应用国际会议(ICoCTA 2025) 会议时间&#xff1a;2025年9月19 -21日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.icocta.org 控制理论作为一门科学技术&#xff0c;已经广泛地运用于我们社会生活方方面面。随着…

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例&#xff0c;介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式&#xff0c;从样式来看&#xff0c;每个按钮的基本样式相同&#xff0c;就是颜色不同。 如果按照传统的方式开发&#xff0c;需要开发btn &…

项目:停车场车辆管理系统

这个代码实现了一个停车场管理系统&#xff0c;主要功能包括车辆信息的添加、删除、修改、查找、显示所有车辆信息、排序以及计算停车费用。系统使用双向链表来存储车辆数据&#xff0c;并提供了菜单驱动的界面供用户选择不同的操作。 主要功能描述&#xff1a; 添加车辆信息&…

RS485方向自动控制电路分享

我们都知道RS485是半双工通信&#xff0c;所以在传输的时候需要有使能信号&#xff0c;标明是发送还是接收信号&#xff0c;很多时候就简单的用一个IO口控制就好了&#xff0c;但是有一些低成本紧凑型的MCU上&#xff0c;一个IO口也是很珍贵的&#xff0c;因此&#xff0c;如果…

《代码随想录》Day24打卡!

《代码随想录》回溯算法&#xff1a;复原IP地址 本题的完整题目如下&#xff1a; 本题的完整思路如下&#xff1a; 1.本题使用递归以及回溯来做&#xff0c;所以依然分为三部曲&#xff1a; 2.第一步&#xff1a;确定递归的参数和返回值&#xff1a;无返回值&#xff0c;参数为…

uboot ,s5pv210 ,bootm分析

先来看看 bootm 的逻辑。 1、 首先是 两 zimage 加上一个头, 变成 Uimage 2、然后是将 uimage 烧写到 TF 卡上去。 3、 然后是 TF 卡上的 uimgae 拷贝到 内存的一段位置上。 4、 然后就是 跳转到 内存的 这个位置上 去运行代码了。 uboot中 将 zimage 变成 uimage…

JS基础 -- 数组 (对象 / 数组 / 类数组 / 对象数组)的遍历

一、数组&#xff1a; 数组是复杂数据类型&#xff0c;用于存储一组有序的数据。 1、创建数组&#xff1a; ① 使用 new 关键字&#xff1a; let arr new Array() // 创建一个长度为0的空数组 let arrLength new Array(5) // 创建一个长度为5的空数组② 字面量形式&#…

利用 AI 高效生成思维导图的简单实用方法

#工作记录 适用于不支持直接生成思维导图的AI工具&#xff1b;适用于AI生成后不能再次编辑的思维导图。 在日常的学习、工作以及知识整理过程中&#xff0c;思维导图是一种非常实用的工具&#xff0c;能够帮助我们清晰地梳理思路、归纳要点。而借助 AI 的强大能力&#xff0c…