动态规划の入门小题,适合0基础看

这篇具有很好参考价值的文章主要介绍了动态规划の入门小题,适合0基础看。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

动态规划是一种作者认为比较牛逼的算法,原因是作者初学时非常困难,认为这玩意非常抽象,它往往在求一些最大,最小XXXX问题上有妙用,这篇文章可以帮大家简单理解一下DP的含义。

对了,这玩意也叫DP,原因是动态规划的英文原意是(dynamic programming)。

然后我们以一个引子来介绍一下

大家可以先独立思考一下这道题目。

题目描述

今有面值为 1、5、11 元的硬币各无限枚。

想要凑出 n 元,问需要的最少硬币数量。

输入格式

仅一行,一个正整数 n。

输出格式

仅一行,一个正整数,表示最少需要的硬币个数。

样例:

输入#1:15

输出#1:3

输入#2:12

输出#2:2

这里附上交题链接:https://www.luogu.com.cn/problem/B3635

———————————————————————————————————————————

这个问题第一眼看到,我觉得大家的做法都是会想到贪心,先拿大的凑,然后再拿小的凑,然后多试几下之后就发现似乎不太对,比如20的话用贪心思路是11+5+1+1+1+1,而实际上5+5+5+5更优。

然后搞半天发现这玩意似乎没啥规律,咋拿都没有一个通用的最优策略,那咋办呢?

别急,我们先细想一下如何凑成某种面值?

假设现在我们要凑一个20,那么我这个20能怎么来呢? 可以轻松得出,从9加个11而来,从15加个5而来,从19加个1而来。

然后我再看9,15,19能咋来,然后再看能到9,15,19的数又是咋来的。。。。子子孙孙无穷尽也。。。。。。

这样想似乎思维难度有些大,不如我们正过来想。

一开始我一分钱没凑,于是我的初始状态就是0。

我们开一个表来方便理解

动态规划の入门小题,适合0基础看,动态规划,算法

那我们现在拥有0的状态了,我们可以推一下从0到其他价值。

容易得到,0能去1,5,和11。

于是这个表变成了

动态规划の入门小题,适合0基础看,动态规划,算法

然后我们0弄好了,再瞅瞅1能去哪

动态规划の入门小题,适合0基础看,动态规划,算法

然后就发现我们能用1再+1变成2,1再+5变成6,1再+11变成12。

再看2能去哪

动态规划の入门小题,适合0基础看,动态规划,算法

然后看3

动态规划の入门小题,适合0基础看,动态规划,算法

再看4

然后发现4可以+1后到5,但是0可以直接+5到5,我用4到5的话要花费5个硬币,而我0到5只花费1个硬币,用4到5的话不是血亏吗,所以5应该留下那个更小的值,于是表就变成了

动态规划の入门小题,适合0基础看,动态规划,算法

从这里开始发现,从前往后看的每个数,都是由前面的数倾尽全力给你的最小的硬币数量,是最优的,那就由此得出猜想,我后面的最优都可以通过前面的最优来算出来,我们继续进行模拟。

5:

动态规划の入门小题,适合0基础看,动态规划,算法

6:

动态规划の入门小题,适合0基础看,动态规划,算法

6到11发现也是血亏的,不如直接0到11,所以此时价值11最少只需1个币。

7:动态规划の入门小题,适合0基础看,动态规划,算法

8:

动态规划の入门小题,适合0基础看,动态规划,算法

9:动态规划の入门小题,适合0基础看,动态规划,算法

10:

动态规划の入门小题,适合0基础看,动态规划,算法

这里我们用10更新时发现15这里最优硬币数是5,但我自己凑(10)的硬币数最少只要俩,那我到15只用再加个5块的硬币就够了,于是15应该被优化成3枚硬币。。。。

然后同时我10+11超过20了,后面都是无效更新,那我就不填到表里去了。

后面一直用这个思路:

最后得出这个表

动态规划の入门小题,适合0基础看,动态规划,算法

然后发现推20的话,最优是4枚硬币。

推所有的数都是这样,这个表里凑成的所有的价值,都是最优的。。

附上这题的AC代码:

可以用数组模拟这个表格,进行DP。

#include<bits/stdc++.h>

using namespace std;

const int N=1e6+5;
int a[N];

int main()
{
    int n; cin>>n;

    for(int i=1;i<=n;i++)
    {
        if(i<5) a[i]=a[i-1]+1;

        else if(i>=5 && i<11) a[i]=min (a[i-5]+1 , a[i-1]+1);

        else a[i]=min ( a[i-11]+1, min( a[i-5]+1 , a[i-1]+1 ));
    }

    cout<<a[n]<<" ";
}

最后总结一下,我们发现DP的思想,就是用前面的最优解来推后面的最优解,也就是局部最优可以推出全局最优,这也是这个思想抽象的地方,把这题理解透彻后明天听课应该能舒服一些,做完后可以用这种思路做一下其他简单DP题嗷,以便加深理解。文章来源地址https://www.toymoban.com/news/detail-760172.html

到了这里,关于动态规划の入门小题,适合0基础看的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像隐写综述(适合小白入门,涉及基础知识、评价指标与前沿算法)

    创作不易,点赞收藏,谢谢!如有交流需要,请关注微信公众号“笔名二十七画生”。 分享有趣知识的公众号 1.图像隐写基础知识 信息保护主要有两种手段: 1.加密技术,是直接对要保护的数据进行数学变换,并使得未授权方无法读取交换的秘密信息。 2.信息隐藏技术,则是将

    2024年02月21日
    浏览(40)
  • 知识储备--基础算法篇-动态规划

    第一次接触动态规划,不知道具体什么意思,做了题才发现动态规划就是把大问题变成小问题,并解决了小问题重复计算的方法称为动态规划。比如上楼梯,一次上一阶或二阶,求有多少种算法,就可以拆成最后一阶的方法数等于前一阶的方法数加前两阶的方法数,这就是递

    2024年02月11日
    浏览(32)
  • 算法基础课第五讲 动态规划

    时间复杂度:状态数量 转移的计算量 * 总体概述:给一堆物品,有体积有价值。有一个背包,在背包能装下的前提下最终能装下多少(背包不一定要装满) DP问题:一般需要从两方面考虑:状态表示以及状态计算 状态表示:f(i,j) 从两个方面考虑:集合(所有选法的集合)(

    2024年02月01日
    浏览(31)
  • 基础算法之——【动态规划之路径问题】1

    今天更新动态规划路径问题1,后续会继续更新其他有关动态规划的问题!动态规划的路径问题,顾名思义,就是和路径相关的问题。当然,我们是从最简单的找路径开始! 动态规划的使用方法: 1.确定状态并定义状态数组:(i,j)代表什么意思?dp[i][j]又是什么意思? 2.确

    2024年02月07日
    浏览(30)
  • acwing算法基础之动态规划--背包问题

    (零) 背包问题描述:有 N N N 个物品,每个物品的体积是 v i v_i v i ​ ,价值是 w i w_i w i ​ ,现有容量是 V V V 的背包,求这个背包能装下的物品的最大价值。 01背包问题:每个物品只有1个。 完全背包问题:每个物品有无穷多个。 多重背包问题:第 i i i 个物品有 s i s_i s

    2024年02月05日
    浏览(37)
  • 【算法思考记录】动态规划入门!力扣2606. 找到最大开销的子字符串【Python3、动态规划】

    原题链接 动态规划(Dynamic Programming,简称 DP)是一种通过将原问题分解为相互重叠的子问题并只解决一次的方法来解决问题的算法优化技术。动态规划通常用于优化递归问题,通过存储子问题的解来避免重复计算,从而显著提高算法的效率。 动态规划的基本思想是将原问题

    2024年02月03日
    浏览(28)
  • Python 算法基础篇:背包问题的动态规划解法

    背包问题是计算机科学中一个重要的组合优化问题,动态规划是解决该问题的高效算法技术。本篇博客将重点介绍背包问题的动态规划解法,包括状

    2024年02月16日
    浏览(31)
  • Acwing-基础算法课笔记之动态规划(背包问题)

    01背包中的0和1指的是放与不放,而且不能出现放多个的情况,背包只能放相同物品中的一个; 首先是对 d [ i ] [ j ] d[i][j] d [ i ] [ j ] 数组的解释,该数组表示的是只看前 i i i 个物品,总体积是 j j j 的情况下,总价值最大是多少; 不选第 i i i 个物品,只考虑前 i − 1 i-1 i −

    2024年04月17日
    浏览(38)
  • 算法基础复盘笔记Day09【动态规划】—— 背包问题

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月22日
    浏览(36)
  • 猿创征文 |【算法面试入门必刷】动态规划-线性dp(一)

    📦个人主页:一二三o-0-O的博客 🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑) 👨‍💻作者简介:数据结构算法与音视频领域创作者 📒 系列专栏:牛客网面试必刷 📣专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer 📝推荐一个找工作

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包