从硬币找零问题:看分治/动态规划/贪心算法的区别与联系

硬币找零问题 硬币找零问题1:给定几种硬币的面值,每种硬币数目无限多,给定一个数值,求出用这些已有的硬币加起来组成的价值等于这个数值的所有组合情况 可以用回溯思想来解决此问题,加入硬币为{1,2,5},目标是组成10,我刚开始是想用递归解决,每递归进去一层,都重新从1,2,5中选取一个数,加上之前累加得到的数,判断是否大于或等于10,这个思路是有问题的,会造成重复,比如某次挑选的路径为1,2,5,后来还会出现 阅读详情

硬币找零问题:存在一堆面值为 v1、v2、v3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为x单位的零钱?这里我们假设v[]={0, 1, 2, 5, 10, 20, 50}。0是用来充位数的,这样v1、v2与下标1、2对上。这里v1必须为1,若不为1的话,给定一个x,可能无法得到一个解,即找不开。比如v[]={2, 5, 10, 20, 50}, x=18,没有解。这里我们为了方便,也设定数组v是排序好的,如果没有排序,用一个排序算法即可搞定。

1、分治策略

在设计分治策略算法之前,我们必须得到解决该问题的一个递推式,即如何将一个大问题划分为若干个小问题。

(1)找递推公式:

f(x, i)表示用v[1],v[2],...,v[i]来找零x所需的最少硬币数,可得递推式如下:

f(x, i)=min( f(x, i-1),  x/v[i] + f(x%v[i], vmax(x%v[i], v)))

其中vmax(x, v)返回i,且i满足v[i]<=x<v[i+1],即找到v数组中可找零的最大的那个面值

这里在求f(x, i)这个大问题的时候,我们对它进行分解:(Divide)

case1,我们跳过v[i],而直接用v[1],v[2],...,v[i-1]来找零x,即f(x, i-1);(Conquer)

case2,我们要用v[i]来找零,可得找零数为x/v[i] + f(x%v[i], vmax(x%v[i], v))(Conquer)

那么case1,case2最小的那个即是f(x, i)。

	int min(int a, int b)
	{
	    if(a < b)
	        return a;
	    return b;
	}
	/*
	x:要找零的数
	v:找零面值数组
	length:数组的长度
	return i, v[i]<=x<v[i+1]
	*/
	int vmax(int x, int v[], int length)
	{
	    int i = 0;
	    while((x >= v[i]) && (i < length))
	    {
	        i++;
	    }
	    return i-1;
	}
	/*
	v:找零面值数组
	x:要找零的数
	i:f(x,i)中的i,表示从v[1],v[2],...,v[i]中找零
	length:找零数组的长度
	*/
	int change_dc(int v[], int x, int i, int length)
	{
	    if(x == 1)
	        return 1;
	    if(x == 0)
	        return 0;
	    if(i == 1) //当i为1时,必须有这个出口;没有的话在下一个f(x,i-1)中,i会为0
	        return x;
	    return min(change_dc(v, x, i-1, length), x/v[i]+change_dc(v, x%v[i], vmax(x,v, length), length));
	}
}

(2)第二种方法:

(取自http://www.ccs.neu.edu/home/jaa/CSG713.04F/Information/Handouts/dyn_prog.pdf)

递推式如下:c(x)为换取x面值零钱所需的最小数量

c(x) = min(1+c(x-v[i])),i的取值范围为i:x>=v[i],这个限制条件必须有,否则会出现负数。

注意:这里的min函数,是遍历完所有的面值后取得最小值。

上面给出的文档应该说的很详细了,不多说,直接上代码。

//算法真的很巧妙啊
	public static int change_dc2(int v[], int x, int length)
	{
	    int i;
	    int min;
	    int temp;
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
	    if(x == 0)//递归出口
	        return 0;
	    
	    min = x;//默认全部拿一元硬币,所以默认最小的数量是x本身
	    for(i=2; i<length; i++)//从面值比一元大的开始,选择
	    {
	        if(x >= v[i])
	        {
	            temp = change_dc2(v, x-v[i], length) + 1;//分治精髓啊!!!这次就是拿,下次循环就是不拿,然后依次比较其最小值
	            if(temp < min)
	                min = temp;
	        }
	    }
	    return min;
	}
	
2.动态规划求解

可能你已经发现了,f(1, 1)、f(1, 2),c(1)、 c(2)等很多子问题会被计算多次,那么我们就可以用动态规划来解决此类问题了。这里有两种不同的方式,一种为自顶向下的备忘录方式(memoization),一种为自底向上的方式。

(1)自顶向下的备忘录方式

我们可以很容易的将分治策略算法改为自顶向下的备忘录方式的算法,因为分治策略算法一般都用递归的思想,而递归就是自顶向下的,这里我们只要加入备忘录的机制就ok了。就是在每求解一个子问题时,我们都判断该子问题时候已求解,若已求解,直接给出解;若没有,我们求解该子问题,并保存该子问题的解,那么在下次求解这个问题的时候可以直接用。

分治策略(1)的自顶向下的备忘录方式:

/*
v:找零面值数组
x:需要找零的数
i:f(x, i)中的i,表示用v[1],v[2],...,v[i]中找零x
length:找零面值数组的长度
c:保存f(x, i)的值,c[x][i]对应f(x, i),调用该函数之前对其所有元素赋值-1,表示没有被求解
*/
int change_dp_memoization(int v[], int x, int i, int length, int c[][])
{
    if(c[x][i] >= 0)
        return c[x][i];
                                                                                                                                                                                                            
    if(x == 1)
    {
        c[x][i] = 1;
        return c[x][i];
    }
    if(x == 0)
    {
        c[x][i] = 0;
        return c[x][i];
    }
    if(i == 1)
    {
        c[x][i] = x;
        return c[x][i];
    }
    c[x][i] = (change_dp_memoization(v, x, i-1, length, c), x/v[i]+change_dp_memoization(v, x%v[i], vmax(x,v, length), length, c));
    return c[x][i];
}

分治策略(2)的自顶向下的备忘录方式:

*/
int change_dp_memoization2(int v[], int x, int length, int c[])
{
    int i;
    int temp;
                                                                                                                                                                                                    
    if(c[x] >= 0)            //if c[x] has caculated
        return c[x];
                                                                                                                                                                                                    
    if(x == 0)
        return 0;
                                                                                                                                                                                                
    c[x] = x;
    for(i=1; i<length; i++)
    {
        if(x >= v[i])
        {
            temp = change_dp_memoization2(v, x-v[i], length, c) + 1;
            if(temp < c[x])
                c[x] = temp;
        }
    }
    return c[x];
}
(2)自底向上的方式

自底向上的方式与自顶向下刚好相反,我们先求解规模小的问题,然后逐层递进,在求规模稍大的问题时,需要用的规模较小的问题已被解决。这里我们要区分自顶向下和自底向上两种不同的方式。自顶向下的方式在求解大问题时,其需要的小问题可能还没求解,可能已被其他稍大的问题所解决,所以我们需要一个数组来保存那些已求解的。而自底向上的方式在求解一个稍大问题的之前,保证比其规模小的所有问题都已解决,这样再求解大问题时,其所包含的小问题都已求解,直接拿来用。还有一个就是,自顶向下一般用递归实现,因为在求解大问题的时候,有的小问题还没有求解,只能递归计算,上面我们已经看到了,可以直接拿分治策略的算法加上备忘录机制就行了,而自底向上一般用迭代实现,逐层向上,直至你所求的问题。

分治策略(1)的自底向上的方式:

int change_dp_bottomup(int v[], int x, int i, int length, int c[][MAX])
{
    int m, n;
    int imax;
                                                                                                    
//当x=0时,不管m为多少,都c[0][m]=0,后面稍大的问题会用到此解,必须事先赋值
    for(m=0; m<length; m++)
        c[0][m] = 0;
                                                                                                      
    for(m=1; m<=x; m++)
    {
        for(n=1; n<=i; n++)
        {
            imax = vmax(m, v, length);
            //这里必须做此判断,因为要保证是从v[1],...,v[i]中找零x,而不是从v[1],...,v[imax]中找零
            if(imax > n)
                c[m][n] = min(c[m][n-1], m/v[n] + c[m%v[n]][n]);
            else
                c[m][n] = min(c[m][n-1], m/v[imax] + c[m%v[imax]][n]);
        }
    }
    return c[x][i];
}
分治策略(2)的自底向上的方式:
int change_dp_bottomup2(int v[], int x, int length, int c[])
{
    int i, j;
    int temp;
                                                                                
    for(i=1; i<=x; i++)
    {
        c[i] = i;
        for(j=2; j<length; j++)
        {
            if(i >= v[j])
            {
                temp = c[i-v[j]] + 1;
                if(c[i] > temp)
                    c[i] = temp;
            }
        }
    }
    return c[x];
}

3、贪心选择

这里我们给出的找零面值数组v[]是满足贪心选择性质的,这里就不证明了。其实只要2v[i]<=v[i+1],就满足贪心选择性质。如果不满足2v[i]<=v[i+1],则找零问题不能用贪心算法解决。比如v[]={0, 1, 2, 5, 8, 10, 20, 50}, x=16, 最优解应该为2,即用两个8面值的硬币找零,而贪心算法的解则为10, 5, 1。下面给出贪心算法的代码:

int change_greedy(int v[], int x, int length)
{
    int count = 0;
    int i;
            
    while(x > 0)
    {
        i = vmax(x, v, length);
        count += x/v[i];
        x = x%v[i];
    }
            
    return count;
}

本文出自 “ 我的黑客” 博客,请务必保留此出处 http://1661518.blog.51cto.com/1651518/1396590







【算法1-动态规划】硬币找零最优解问题 1.问题: 给定一个整数数组 int coins[] 表示不同面额的硬币, int amount表示总金额,返回找零所需的最少硬币数量。如果总金额为0,可以由0枚硬币组成。如果这笔钱不能由任何硬币组成,返回-1。硬币数量无限制。 输入:硬币面值(种类不限),总金额 输出:找零所需的最少硬币数量 Problem: You are given an integer array coins representing coins of different . 阅读详情

相关推荐

硬币找零问题详解及动态规划解法

动态规划提供了一种高效解决硬币找零问题的方式。通过保存已经计算出的结果,避免了大量重复计算,从而大大提高了算法的效率。这个思路不仅适用于硬币找零问题,还可以扩展到很多类似的最优化问题中。

weixin_37600397的博客 3626

硬币找零问题(贪婪算法和动态规划)

1.硬币找零问题     在学习算法分析时候的一个经典问题就是硬币找零问题。该问题是给一些不同面值的硬币,其中=1,以及数值M。要计算出找M所需要的最少硬币数。    比如我们有硬币&amp;lt;1,5,10,20&amp;gt;,那么如果要找33块钱的话,最少的零钱数是20+10+1+1+1,一共5个硬币。这就是硬币找零问题的简介。   2.贪婪算法(Greedy algorithm)     从上...

qq_29848559的博客 1万+

贪心算法教程

贪心算法简明教程摘要 贪心算法是一种通过局部最优选择逐步构建全局解的算法策略。其核心特点是每一步都采取当前状态下最优的选择,无需回溯。典型应用包括找零问题(优先使用大面额硬币)、活动选择(按结束时间排序)和部分背包问题(按单位价值排序)。适用条件需满足贪心选择性质(局部最优能导向全局最优)和最优子结构性质(问题可分解为子问题组合)。 与动态规划相比,贪心算法更高效但适用范围有限;与分治算法不同,其子问题选择具有依赖性。经典案例证明,当问题满足特定性质时,贪心算法能以高效的时间复杂度(常为O(nlogn))获

peter_wang1的博客 946

算法与数据结构(十八):硬币找零问题总结

一、 01硬币找零问题(01背包) 给定不同面额的硬币 coins 和总金额 m。每个硬币最多选择一次。计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 状态表示 f[i][j] 表示只看前 i 个物品,总价值是 j 的情况下的最小硬币数目。 状态转移 f[i, j] = min(f[i-1, j], f[i-1, j-ci] + 1) 分别对应了...

Dby_freedom的博客 2527

贪心算法在数据结构与算法中的应用剖析

本文旨在全面介绍贪心算法,包括其基本原理、实现方法、应用场景以及优缺点。我们将通过多个经典问题的解决方案,展示贪心算法的实际应用价值。文章首先介绍贪心算法的基本概念,然后深入讲解其核心原理和实现方法。接着,我们将通过多个实际案例展示贪心算法的应用,最后讨论其局限性和未来发展趋势。贪心算法(Greedy Algorithm):一种在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法策略。最优解(Optimal Solution):在给定约束条件下,能够最好地满足目标函数的解。

AI 算法实战派 567

Java实现零钱找零算法项目实战

找零问题是计算机科学中经典的问题之一,尤其在零售业与金融交易处理中极为常见。问题的核心是给定货币面额的集合,如何用最少的硬币或纸币数量组成顾客应得的找零金额。这不仅涉及到货币价值计算,还关系到资源优化配置。动态规划(Dynamic Programming,DP)通常用于优化问题,其目标是在给定的约束条件下找到最优解。它要求问题可以被分解为重叠的子问题,并且这些子问题的解决方案可以组合起来解决原问题。动态规划解决问题的关键特点包括:最优子结构:问题的最优解包含其子问题的最优解。

weixin_42613360的博客 964

分治、贪心、动态规划、回溯算法思想回顾与总结

对前几次算法实验的总结 分治、贪心、动态规划、回溯算法思想回顾与总结

insouciant_22的博客 1395

基于PTB-XL数据集的深度学习心电信号分类

心电信号的分析与处理是心血管疾病诊断的重要手段。该领域的主要工作领域是分类,它越来越多地得到基于机器学习的算法的支持。在这项工作中,开发了一个深度神经网络来自动分类初级心电信号。这项研究是在PTB-XL数据库中包含的数据上进行的。提出了三种神经网络架构:第一种基于卷积网络,第二种基于SincNet,第三种基于卷积网络,

weixin_55121617的博客 7007

贪心、回溯、动态规划、分治算法的区别(附Java代码)

贪心、回溯、动态规划、分治算法都是常见的算法思想,主要区别在于它们解决问题的方式和适用的场景。

MCN的博客 1446

EB配置输入捕获ICU模块----基于S32K3

基于S32K311芯片,EB配置ICU输入捕获(Emios 和Siul)

weixin_43586400的博客 1772

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 260

动态规划及贪心算法

算法思想 动态规划(Dynamic programming,简称DP);核心思想是把原问题分解成子问题进行求解,也就是分治的思想。 那么什么问题适合用动态规划呢?我们通过一个现实中的例子,来理解这个问题。大家可能在公司里面都有一定的组织架构,可能有高级经理、经理、总监、组长然后才是小开发,今天我们通过这个例子,来讲讲什么问题适合使用动态规划。又到了一年一度的考核季,公司要挑选出三个最优秀的员工。一...

weixin_43892514的博客 3596

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 377

一文带你“看透”贪心算法:概念、代码与应用

文章摘要: 贪心算法是一种通过局部最优选择寻求全局最优解的算法策略,具有简单高效的特点,但并非适用于所有问题。文章系统介绍了贪心算法的概念、特点、应用场景和代码实现,并通过找零钱和活动选择等经典案例进行说明。重点分析了贪心算法与动态规划、分治法的区别,以及判断问题是否适用贪心算法的三个关键标准:贪心选择性质、最优子结构性质和反证法验证。文章指出贪心算法在满足特定条件的问题中表现优异,但也存在局限性,需要根据问题特性谨慎选择使用。随着技术发展,贪心算法在大数据处理、人工智能等领域的应用前景广阔。

大雨淅淅的博客 992

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 220

【Matlab】飞行器气动弹性仿真与分析

气动弹性是飞行器设计领域的核心交叉学科,融合了空气动力学、结构动力学和控制理论,主要研究飞行器结构在气动力作用下的弹性变形、振动响应及相互耦合规律,直接影响飞行器的飞行稳定性、操纵性和结构安全性。随着飞行器向高速度、高机动性、轻量化方向发展,气动弹性问题愈发突出,如颤振、发散、嗡鸣等现象,严重时会导致飞行器结构破坏甚至飞行事故,因此气动弹性仿真与分析已成为飞行器设计、验证和优化的关键环节。当前,飞行器气动弹性仿真面临诸多技术挑战:气动力与结构变形的强耦合特性难以精准描述,易出现仿真误差;

unber的博客 233

动态规划问题dp问题以及经典问题

动态规划 其实他的思想跟分治还是很像的,都是分成子问题求最优解最后合并推出总体的最优解。 动态规划和分治都是将大问题划分为小问题,小问题间独立是分治,小问题间有状态关系,并且需要用到之前状态是动态规划,不需要的是贪心法。 经典问题有找硬币,爬楼梯 (1)硬币找零: 给予不同面值的硬币若干种种(每种硬币个数无限多),如何用若干种硬币组合为某种面额的钱,使硬币的的个数最少? 在现实生活中,我们往往使用的是贪心算法,比如找零时需要13元,我们先找10元,再找2元,再找1元。如果我们的零钱可用的有1、2、5、9、1

阿也的博客 247

YOLOv11涨点改进| TGRS 2026 顶刊| 注意力改进篇| 引入MSEA多尺度边缘感知注意力,助力红外小目标检测、遥感目标检测、工业缺陷检测、图像去雨雾任务高效涨点

🔥本文提出了一种基于MSEA多尺度边缘感知注意力的YOLOv11改进模型,通过增强网络对边缘、纹理和细粒度信息的感知能力,显著提升复杂背景下的目标检测性能。MSEA模块采用多尺度空洞卷积提取上下文特征,并通过边缘监督和注意力融合机制强化目标边界信息。实验表明该方法在小目标、边界模糊目标和复杂纹理目标检测任务中表现优异,尤其在遥感、工业缺陷和红外检测等场景具有显著优势。文章详细介绍了MSEA的结构原理、核心代码实现、模块配置方法以及三种YOLOv11改进方案.

Ai缝合怪、助力小伙伴高效发论文 184

一文写清楚什么是动态规划

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果。 1. 什么是动态规划 1.1. 百度百科对于动态规划的解释 动态规划,切勿望

XiaoCai 7568

Simulink中搭建一个包含PID控制的压电陶瓷快反镜模型

这个模型只是一个基本框架,你需要根据实际的系统参数和要求进行调整和优化。希望这些步骤能帮助你在Simulink中搭建所需的模型。

AI的内部世界的博客 474

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【动态规划理论】:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题

上一节,我通过两个非常的问题,向你展示了用动态规划问题的过程。今天主要讲一些理论知识。学完这节内容,可以帮你解决这几个问题:什么样的问题可以用动态规划来解决?解决动态规划问题的一般思路是什么?贪心、分治、回溯、动态规划这四种算法思想又有什么区别和联系。 “一个模型三个特征”理论的讲解 动态规划作为一个非常成熟的算法思想,很多人对此做了非常全面的总结,我把这部分理论总结为“一个模型三个特征”。 ...

南方以北 2万+

深度学习工具包 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&#39;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 = &quot;R. B. Palm&quot;, title = &quot;Prediction as a candidate for learning deep hierarchical models of data&quot;, year = &quot;2012&quot;,}```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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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 &lt; 0.10, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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 &lt; 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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&lt;0.12, &#39;Too big error&#39;);```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(&#39;state&#39;,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 &lt; 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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 &lt; 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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 &lt; 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free &quot;Bitdeli Badge&quot;)

动态规划入门:从最少硬币到背包问题的核心原理与实战

动态规划是求解最优化问题的重要算法思想,其核心在于将复杂问题拆解为具有重叠子问题的小问题,通过缓存子问题结果避免重复计算,从而大幅提升效率。理解动态规划需要掌握三个关键概念:最优子结构、状态转移方程和边界条件。最优子结构保证大问题的最优解可由子问题最优解组合而成;状态转移方程则描述子问题之间的递推关系;边界条件作为递推的起点,直接决定求解的准确性。与贪心算法的局部最优不同,动态规划通过全局枚举所有可行决策确保全局最优,在资源分配、路径规划、文本对齐等工程领域有广泛应用。本文从经典的找零钱问题出发,逐步过渡到

weixin_34417200的博客 337

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

分治策略、动态规划、贪婪选择以及递归之间的关系与区别(二)

上一文中,我们浅析了分治策略、动态规划、贪婪选择以及递归之间的关系,下面我们通过一个实例,硬币找零问题,来分别设计分治算法、动态规划算法、贪心算法。硬币找零问题:现存在一堆面值为 v1、v2、v3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为x单位的零钱?这里我们假设v[]={0, 1, 2, 5, 10, 20, 50}。0是用来充位数的,这样v1、v2与下标1、2...

weixin_34162228的博客 403

算法分析与设计 期末复习重点知识总结

知识点+习题 两天速成

人言束负兑生|完美是完蛋的开始 3070

动态规划 vs 贪心算法:异同点深度解析

例如,背包容量为5,有3个物品(重量分别为2、3、1,价值分别为3、4、2),动态规划会遍历所有可能的物品组合,找到价值最大的方案。动态规划的核心思想是将一个复杂问题分解为一系列相互关联的子问题,通过求解子问题并保存其结果(避免重复计算),逐步构建出原问题的最优解。它强调从全局出发,考虑每个决策对后续状态的影响,通过“记忆化搜索”或“递推”的方式,确保最终得到的解是全局最优。贪心算法则采用更为“短视”的策略,在每一步决策中,只选择当前状态下的最优解,不考虑该选择对后续步骤的影响,也不回溯已做出的决策。

2501_91651594的博客 721

总结动态规划算法

目录一、前言1.1、引子1.2、介绍二、正文2.1、方法总结2.1、实战分析 一、前言 1.1、引子 计算机归根结底只会做一件事:穷举。所有的算法都是在让计算机如何聪明地穷举而已,动态规划也是如此。 还是要从一个经典的例子说起——斐波那契数列(详细可见我的另一篇文章 斐波那契数列递归算法优化),我们似乎可以发现动态规划遵循一套固定的流程:递归的暴力解法 -&gt; 带备忘录的递归解法 -&gt; 非递归的动态规划解法。所以从某种程度上来说,所有的动态规划本质都是优化后的暴力求解。 1.2、介绍 DP

qq_44543551的博客 300
上一篇: 分治算法,动态规划,贪婪算法以及递归之间的区别与联系
下一篇: hash在算法中的应用
NFMSR
博客等级 码龄11年 59粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值