【DP_背包专题】 背包九讲

这段时间看了《背包九讲》,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题。目前做了点小总结,大概提了下每道题的思路重点部分,希望以后回看回想时能有帮助。

题单:http://vjudge.net/contest/22694#overview


题单列表

HDU 1059、HDU 1114、HDU 1171、HDU 1203、HDU 1712、HDU 2159、

HDU 2191、HDU 2546、HDU 2602、HDU 2639、HDU 2844、HDU 3033、

HDU 3449、HDU 3466、HDU 3535、HDU 3810


题目分类

0-1 背包:HDU 1059、HDU 1203、HDU 2546、HDU 2602、HDU 3466

完全背包:HDU 1114

多重背包:HDU 1171、HDU 2191、HDU 2844

混合背包:HDU 3535

二维背包:HDU 2159

分组背包:HDU 1712、HDU 3033

有依赖背包:HDU 3449

背包问题变化:HDU 2639、HDU 3810


题目分析

  • HDU 1203:

0-1背包问题,直接套上两层循环即可。

注意需要将 dp[j - cost[i]] + val[i] 改为 dp[j - cost[i]] * val[i]。

  • HDU 2546:

0-1背包问题。

首先用5元买最贵的东西,然后剩下的做普通0-1背包即可。

  • HDU 2602:

0-1背包基础入门题。

需要注意的是,如果要求恰好装满背包则除dp[0]外所有都需要初始化为-∞,这样可以保证最终状态f[n]是恰好装满背包的状态最优解。

如果没要求背包恰好装满,只希望价格尽量大,此时应将整个dp数组初始化为0。

  • HDU 3466:

0-1背包问题。

给入物品要按照价格p和价格限制q对q - p进行从小到大排序。解释如下:

对任意两个物品,A:p1, q1 B:p2, q2。先选A,则至少需要剩余p1 + q2的容量才能将两个物品买下,而先选B则至少需要p2 + q1,如果p1 + q2 > p2 + q1,那么要选两个的话的就要先选A再选B,公式可换成q1 - p1 < q2 - p2,就按这样的方法排序最后的顺序就是最优的顺序。

  • HDU 1114:

完全背包入门问题。

本题求得是最小值,所以初始化时除dp[0] = 0外其余全部为+∞。

  • HDU 1059:

多重背包基本问题。

需要二进制优化下,不然会超时。

  • HDU 1171:

多重背包问题。

因为小的一方获得总价值最多为sum / 2,所以dp范围是0~sum/2。然后二进制优化下按照0-1背包做。

  • HDU 2191:

多重背包入门问题。

直接套背包九讲。

  • HDU 2844:

多重背包问题。

直接套背包九讲。注意二进制优化。

  • HDU 3535:

混合背包问题。

详细题解见:http://www.cnblogs.com/coredux/archive/2012/07/26/2610868.html

  • HDU 2159:

二维背包问题。

dp[i][j]表示忍耐度为i,且还可以杀j个怪时能获得的最大经验值。

  • HDU 1712:

分组背包入门问题。

直接套背包九讲。

  • HDU 3033:

分组背包变种问题。

普通分组背包是每组中最多取一件,这里是至少取一件。

dp[i][j]代表前i组容量为j的最大价值。由于一组里面有多个物品,所以状态转移可以是前一组少取一个,即dp[i - 1][p - cost[i][j]] + val[i][j],也可以是当前组之前去过的少取一种,即dp[i][p - cost[i][j]] + val[i][j]。

这里需要注意下两个情况的先后顺序,需要先进行当前组的比较再与前一组进行比较(即单纯的分组背包必选情况,特别的是物品有0花费的情况,0花费要先放在当前层,再放在上一层才不会买两次,即先买0花费的)。

注意初始化时除dp[0]一行外全部为-∞,因为是恰好从上一组转移到这一组。

  • HDU 3449:

依赖背包问题。

题中买相应物品必须买相应箱子,箱子即依赖。在做0-1背包时需要先将box的影响除去,即在做0-1背包前先dp2[j] = dp[j - box[i]],更新枚举起点即可。在0-1背包做完后将dp与dp2中的最优值放入dp中即可。

  • HDU 2639:

求0-1背包的第K大解。

对于一般的背包方程为f[i-1][v] = max( f[i-1][v], f[i-1][v - cost[i]] + val[i] ),因为要记录第K大解,我们必然要记录前K大的所有解。所以我们从有序队列f[i-1][v][1...K]和f[i-1][v - cost[i]][1...K] + val[i]两个序列合并且取前K大不重复值存入f[i][v][1...K]中。实现过程中可以做滚动数组优化。时间复杂度为O(VNK)。

  • HDU 3810:

0-1背包变种问题。

详细题解见:http://blog.csdn.net/woshi250hua/article/details/7609293


一点总结

个人认为背包九讲中最基础最重要的两个模型是0-1背包模型和完全背包模型,把这两个模型弄懂了多抠细节,后面的模型理解起来会轻松很多。

转载于:https://www.cnblogs.com/Hitman_47/p/5671047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。
CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的这个代码主要是研究手写数字的识别效率,用卷积神经网络算法来实现,用的是官方手写字体数据,能够显现百分之九十以上的识别率+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!
基于LSTM+CNN的自然语言处理,基于单维LSTM、多维LSTM时序预测算法和多元线性回归算法的预测模型LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值