「动态规划::背包DP」多重背包 / 二进制优化|单调队列优化 / AcWing 4|5|6(C++)

多重背包Ⅲ 单调队列优化 多重背包Ⅲ 单调队列的优化 写在前面 最近又跑去看了背包九讲 然后前面都很顺利 直到多重背包Ⅲ 也就是两万的数据范围后 开始不断tle 心想着我原来能过的呀 二进制优化不就好了吗 看了评论发现是加强了数据 二进制优化是NVlog(S)的时间复杂度 算了算确实是超时的 那没办法 算法这东西 讲的不就是一个优化嘛。 看看题 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大 阅读详情

目录

概述

思路

算法过程

Code 

复杂度

优化方案

1.二进制优化

Code

复杂度

2.单调队列优化

Code

复杂度

总结


概述

AcWing 4|5|6:

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式

第一行两个整数,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 ,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N≤10000
0<V≤200000
0<vi,wi,si≤20000

输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10

多重背包是背包问题中较为复杂的一个问题,我们将依次介绍朴素算法、二进制优化、单调队列优化,来依次解决AcWing 4、5、6。

之所以称为多重背包,是因为每个物品有选择次数限制。


思路

朴素地来讲,我们用三重循环来解决这个问题。

 定义dp[a][b]为能够物品选择范围为前a个物品且当前背包最多能装体积为b的物品总量时的最优解。

这样,我们就可以从小问题推导出大问题的解,应该是这样的:

考虑选择范围为前i个物品,体积为j,当dp[i - 1]的所有状态已知时,对于第i个物品,有选几个的状态,取所有情况最大值。

即dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i] * k] + w[i] * k) (1 <= k <= s[i]);

如果 j < v[i],则代表放不下这个物品,dp[i][j] = dp[i - 1][j];


算法过程

我们可以得到非常直观的三重循环。

我们直接做一次空间优化,即使用一维dp数组。

这一部分可以参照此前的背包dp文章。 

Code 

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 101;
int n, m;
int v[N], w[N], s[N];
int dp[N];
int solve(){
    for (int i = 1; i <= n; i++)
        for (int j = m; j; j--) {
            for (int k = 1; k <= s[i] && k * v[i] <= j; k++)
                dp[j] = max(dp[j], dp[j - k * v[i]] + k * w[i]);
        }
    return dp[m];
}
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> v[i] >> w[i] >> s[i];
    cout << solve();
    return 0;
}
复杂度

时间复杂度: O(m\sumsi) 

空间复杂度: O(m)    

可惜这个时间复杂度过高,仅能通过AcWing 4。 


优化方案

多重背包有着两个非常知名的优化。

1.二进制优化

证明一件事:

将自然数a进行2进制拆分为 a = \sum2^{i} + m,

即序列1,2,4,...,2^n,m,其中0 <= m <  2^(n + 1)。

这个序列的部分元素相加可以组合出[1, a]之间的所有自然数。

证明:{

        由等比数列求和:1+2+⋯+2^(n)=2^(n + 1)−1。

  •  对于[1, 2^(n + 1) - 1]自然数:

        考虑二进制01表示:0001,0010,0100,1000的组合可以表示1111内的所有数。

  • 对于(2^(n + 1) - 1, a]自然数:

        设有(2^(n + 1) - 1, a]内的自然数 b = t + m,其中 a = 2^(n + 1) − 1 + m。

        b <= a,即 t <= 2^(n + 1) − 1。

        若t不等于0,那么t属于[1, 2^(n + 1) - 1]]即第一种情况,可以被表示;若t = 0,b = m。

        组合出t后想组合出b还剩一个m,这可以被a序列中的m表示。

}

那么我们可以对k件相同物品进行二进制拆分,这个二进制序列可以组成1到k件原始物品,那就是转化为了对这个二进制序列的01背包进行求解。

Code
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e5 + 5;
int n, m, new_n = 1;
int v[N], w[N];
int dp[N];
int solve(){
    for (int i = 1; i < new_n; i++)
        for (int j = m; j >= v[i]; j--) 
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
    return dp[m];
}
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int vv, ww, s;
        cin >> vv >> ww >> s;
        int idx = 1;
        while(s >= idx) {
            v[new_n] = vv * idx;
            w[new_n] = ww * idx;
            new_n++;
            s -= idx;
            idx *= 2;
        }
        if (s){
            v[new_n] = vv * s;
            w[new_n] = ww * s;
            new_n++;
        }
    }
    cout << solve();
    return 0;
}
复杂度

时间复杂度: O(m\sumlogsi) 

空间复杂度: O(m)    

 可惜这个时间复杂度还是不够低,不能通过AcWing 6。 

2.单调队列优化

换个思路。

考虑当前第 i 个物品。

观察转移方程:dp[j] = max(dp[j], dp[j - k * v[i]] + k * w[i]);

当前dp[j]总是从dp[j -  v[i]], dp[j - 2 * v[i]],....,中转移得到,而这些下标的共同点是对v[i]同余。(就是指 j % v[i] == (j - v[i]) % v[i],这里很好理解)

也就是说状态是在同余下标内部转移的,那我们就可以把所有的下标按对v[i]的余数分组,然后分组循环。

更进一步,考虑我们的转移规律:从同余元素中挑选此前的最大价值进行转移,我们可以考虑单调队列:「队列」单调队列 / LeetCode 239(C++)

具体的想法是这样的: 

由于物品个数有限,队列的大小是有限的,不能超过物品数目,也就是不能从非法状态转移:

若s[i] = 2, dp[j] 不能从 dp[j - 3 * v[i]] + 3 * w[i]转移,因为3超过s[i]了。

用队头储存可行的最有价值的下标,用以转移到当前 j 处。

所谓容量a比b有价值,就是指在 a 大于 b的情况下,b的价值加上b扩容至a的额外容量下增添的物品 i 价值仍然打不过a,即dp[a] >= dp[b] + (a - b) / v[i] * w[i]。

形象理解:

    b    a         j
[vi] [vi] [vi] [vi]|
若dp[j]来自a,则dp[a] + 2 * vi > dp[b] + 3 * vi。

以这个逻辑维护单调队列,即若 j 比队尾更优,则队尾弹出,直到 j 不再更优,将 j 加入队尾。 

Code
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2e4 + 5;
int n, m;
int v[N], w[N], s[N];
int dp[N], assist[N], q[N];
int solve(){
    for (int i = 1; i <= n; i++){
        copy(dp, dp + m + 1, assist);
        for (int k = 0; k < v[i]; k++) {
            int h = 0, t = 0;
            q[t] = k;
            for (int j = k + v[i]; j <= m; j += v[i]) {
                if (j - q[h] > s[i] * v[i]) 
                    h++;
                dp[j] = max(assist[j], assist[q[h]] + (j - q[h]) / v[i] * w[i]);
                while (h <= t && assist[j] - assist[q[t]] >= (j - q[t]) / v[i] * w[i])
                    t--;
                q[++t] = j;
            }
        }
    }
    return dp[m];
}
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> v[i] >> w[i] >> s[i];
    cout << solve();
    return 0;
}

在细节处理上,由于单调队列从左向右滑动,倒序枚举思路已不可行,我们使用两个一维数组来优化空间,用assist辅助数组存储上次计算的结果。

j < v[i] 时,表示一个物品 i 都无法放入背包,我们只需要将其入队,然后计算从 k + v[i]开始的j。

std::deque常数过大,在复杂度正确的情况下也会爆掉,所以用原生数组模拟队列。 

复杂度

时间复杂度: O(nm) 

空间复杂度: O(m)    

复杂度分析:

时间分析:{

        最外层 i 枚举n次,

        对于每个 i 枚举 k 分为v[i]组。

        对于每个 k 枚举 j 有m / v[i]次循环,单调队列内m / v[i]个元素各进队出队一次,均摊到 j 为O(1)。

        O(n * v[i] * m / v[i]) = O(nm)。

}


总结

多重背包问题是背包系列中较复杂的一个问题,希望你有所收货。。

题解:AcWing 6 多重背包问题III 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。,用空格隔开,分别表示物品种数和背包容积。种物品的体积、价值和数量。输出一个整数,表示最大价值。,用空格隔开,分别表示第。本文分享的必刷题目是从。 阅读详情

相关推荐

题解:AcWing 6021 混合背包

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(,前两个整数分别表示每个物品的重量,价值,第三个整数若为。仅一行,一个数,表示最大总价值。

团爸讲算法 278

多重背包问题——单调队列优化

详解多重背包问题——单调队列优化

Turing_Sheep的博客 5191

多重背包单调队列优化问题.pdf

多重背包单调队列优化问题.pdf

多重背包详解,二进制优化、单调队列优化

迭代一下

EQUINOX1的博客 3626

数据字典实战:如何用Excel快速搭建你的第一个数据字典(附模板下载)

本文针对中小团队在软件开发中面临的术语不一致问题,提供了一套使用Excel快速搭建数据字典的实战指南。文章详细讲解了核心字段设计、填充示例、高阶技巧及团队协作维护流程,旨在通过这一轻量级工具统一团队共识、提升开发效率,并附有实用模板下载。

weixin_29303701的博客 380

探索Three.js:利用ShaderMaterial实现动态着色器特效

本文深入探讨了Three.js中ShaderMaterial的应用,指导开发者利用GLSL编写自定义着色器实现动态特效。文章从核心概念GLSL、Uniforms与Attributes讲起,通过创建动态颜色变化平面的实战案例,逐步进阶到实现波纹扩散与动态光影等高级效果,并提供了性能优化与调试技巧,帮助读者掌握创建高性能WebGL视觉特效的关键技能。

weixin_29250403的博客 201

多重背包问题---超详细讲解+优化(不懂你揍我)

多重背包我们其实可以看成为01背包和完全背包的组合。但是怎么组合的呢?也可以就把多重背包问题转换成01背包问题,我们一起来看看解题思路。 1.状态表示 DP问题我们先来看状态表示 二维数组的表示,F[i][j]代表前 i 个物品中,背包容量为 j 时所能拿到的最大价值。 然后我们就看如何把多重背包转换成01背包与完全背包。 2.转换 (1)转换为01背包 我们知道,01背包问题指的是各个物品只有一件,但在多重背包问题中,我们每种物品有 Si 件。 我们可以考虑将多个同种物品合成一件物品。..

windfriendc的博客 4万+

GraphSense介绍

GraphSense是一个跨账本加密货币分析平台 它的介绍在这里 代码也是开源的 graphsense-dashboard 用于交互式加密货币分析的Web仪表板。 可以看导进数据的情况 graphsense-transformation 基于spark/cassandra/java服务运行 GraphSense转换管道,用于将加密货币的区块/交易/标签等数据导入,可以看它指定的json格式: t...

幸福诗歌的博客 1082

单调队列优化多重背包问题

单调队列,多重背包问题

A8649947的博客 3888

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1414

Windows系统监控实战:Grafana+Prometheus+node_exporter保姆级配置指南(含常见问题解决)

本文提供了一份详尽的Windows系统监控实战指南,详细讲解了如何从零部署Grafana、Prometheus和node_exporter(实际为windows_exporter)监控栈。内容涵盖核心组件认知、分步配置解析、高级生产环境考量,并重点针对配置过程中常见的“No Data”问题提供了系统性的排查手册,旨在帮助用户快速搭建稳定可靠的系统资源监控平台。

weixin_29197835的博客 1008

AcWing 5:多重背包问题 II ← 二进制优化

本题中,每种物品最多 2000 件。依据二进制优化的思想,可将 2000 分解为 2000=1+2+4+…+2^9+C,即每种物品最多拆分成 11 堆。又由于题目给出的物品种数的上限为 1000,因此二进制优化后最多有 11×1000 堆物品(也即多重背包二进制优化后对应的物品总数)。

hnjzsyjyj的专栏 1万+

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4372

C++动态规划实战:从采药问题到0/1背包算法详解

动态规划是解决最优化问题的核心算法思想,其核心原理是将复杂问题分解为重叠子问题,并通过存储子问题的解来避免重复计算,从而显著提升效率。在算法与数据结构领域,动态规划的技术价值在于它能将指数级的时间复杂度优化为多项式级,是解决资源分配、路径规划等问题的利器。其经典应用场景之一便是0/1背包问题,即在有限容量的约束下,从一组物品中选择若干件,使得总价值最大。本文以经典的“采药问题”作为具体案例,深入剖析了如何将现实约束转化为数学模型,并详细推导了状态定义与状态转移方程。通过C++代码实现,本文重点讲解了从基础二

weixin_30785593的博客 368

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。

一键难忘的博客 1084

Android 10.0 kenel中修改rom系统内部存储的大小

在10.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分的值最好了,接下来分析下计算rom容量的 相关代码,然后做出修改

安卓兼职framework和app工程师的博客 1406

ACM - DP - 提高1 (数字三角形 / 方格 + 最长上升子序列 + 背包)

这里写目录标题一、数字三角形模型:只能朝右或下走1、AcWing 1018. 最低通行费:只走一次2、AcWing 1027. 方格取数:走两次,只拿一次,且可重复3、AcWing 275. 传纸条:走两次,只拿一次,且不可重复二、最长上升子序列模型1、AcWing 1014. 登山:既上山又下山2、AcWing 1012. 友好城市:线性互不交叉3、AcWing 1016. 最大上升子序列和4、AcWing 1010. 拦截导弹:最长上升子序列 == 最少用多少个非上升子序列才能填满整个序列(反之亦然)5

优快云Wudanna的博客 675

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

阿陈的刷题集 --- 算法基础

记录刷题的题单, 刷完写完题解再贴.....写题解真费脑子..自己能明白, 就是写不明白, 干巴爹!!!!

mumuynsi的博客 380

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

AcWing算法基础课(配套习题)

本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!1.:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。2.:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

团爸讲算法 1001

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝桥杯国赛动态规划模板:从背包到状压DP的实战指南

动态规划(DP)是解决最优化问题的核心算法思想,其原理在于将复杂问题分解为重叠子问题,并通过状态转移方程递推求解。该技术在算法竞赛和工程实践中具有极高价值,广泛应用于资源分配、路径规划、序列分析等场景。本文聚焦于算法竞赛高频考点,深入解析背包问题、线性DP、区间DP及状态压缩DP等经典模型。针对蓝桥杯国赛等高压环境,提供了模块化、场景化的DP模板,旨在帮助选手快速识别问题特征,套用经过验证的代码框架,从而将思考重心从底层实现转移到模型应用与优化上,有效提升解题效率和代码正确率。

weixin_30522983的博客 278

蓝桥杯真题每日一练:算法能力提升与高效刷题方法论

算法是计算机科学的核心基础,其本质是通过特定步骤解决问题的方法论。理解算法原理,如动态规划、深度优先搜索等,能有效提升逻辑思维与问题分解能力,在软件开发、数据分析等领域具有极高技术价值。对于准备技术面试或编程竞赛的学习者,系统性的真题训练是巩固知识、洞察考点的高效途径。本文聚焦蓝桥杯真题,结合动态规划、深度优先搜索等高频考点,拆解从审题到调试的完整解题流程,并提供四步刷题法等实用学习框架,帮助读者构建扎实的算法知识体系与解题思维。

weixin_30292745的博客 430

【算法】大厂机考总结和HOT100

【最新最全】华为OD历年机试题集合+OJ刷题网址+刷题经验_华为的外包都要提前刷题 数据库刷题的地址是哪个-优快云博客。

qq_58358642的博客 378

多重背包(二进制优化+单调队列优化)

但是我们的单调队列维护的就是这个最大值,但是现在当位置发生变换的时候,相同位置上的值发生改变了,这该如何办。我们发现,余数不同的之间不会相互影响,因此我们可以考虑分组进行转移。是不会影响单调性的,相当于没加,我们可以当成不操作,但是,有一个新数会加入到队列。,但是我们发现,对于相同位置,需要的状态转移表达式是不一样的。此时,我们为保证大小,就必须更改队列中的元素,使得他们都加。我们可以反过来看,我们需要比较的只是大小关系,我把。,因为我们队列中各村放的是每个转移的体积,的倍数,说明转移和被转移的体积对。

zxsure的博客 1464

单调队列优化多重背包

单调队列优化多重背包算法是一种高效的求解多重背包问题的算法。其主要优点是能够有效地提高算法效率,并且支持背包容量不固定的情况。其主要应用领域包括文本编辑器、图形处理、机器学习等领域。

m0_72410588的博客 754

多重背包的单调队列优化

本博客讲解单调队列优化多重背包,知识点涉及背包更新的特性、遍历方式与原因、最大值更新的方式、队列头元素的含义、队列元素如何更新、代码实现以及算法复杂度分析。博客内容比较详细丰富,讲解比较全面,照顾新人,希望对大家有帮助。

m0_72579201的博客 2357

二进制优化背包

有一个背包,体积为m。现在给出n种物品,每种物品体积为ai​,价值为bi​,个数为ci​。求这个背包能装下物品的最大价值为多少。如果把第i种物品拆成ci​个物品来用01背包的方法做,则时间复杂度为O(m∑ci​),在一些时候会TLE。所以我们需要用到二进制优化。对于题中的ci​,我们可以把它分为(2t−1)+(ci​−2t+1),其中t是满足ci​−2t+1≥0的最大整数。2t−1。

tanjunming2020的博客 1047
上一篇: 「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)
下一篇: 「动态规划::状压DP」双数组排列问题 / LeetCode 1879|2850(C++)
Daking-
博客等级 码龄3年 912粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值