1 solutions

  • 0
    @ 2024-11-15 23:20:46

    一道再经典不过的动规题

    我们先接着这道题的过程,梳理一下DP的思路

    先来介绍一下什么是动态规划(DP): 1.本质:一种递推 从前面得到的数值可以推出后面的数值 2.要素: 一是要求题目不需要最优解的过程 二是后面的数值只由前面的数值决定 3.内容: 首先是想好dp要记录什么(一般是题目问的) 其次是初始化数组(尤其注意dp[1]或者dp[0]) 最后要想好状态转移方程,也就是如何转移dp中的数据 这点是最重要的内容

    现在看到原题

    对于一个n元的凑法,你可以从n-11元开始,再取一枚11元的硬币,也可以从n-5元开始取一枚5元的,也可以从n-1开始取1元的,最后三个结果取最小值即可。

    我们现在让dp[i]记录i元的最小硬币数,所以有: dp[i] = min(min(dp[i - 1],dp[i - 5]),dp[i - 11]) + 1;

    这就是状态转移方程

    最后附上代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int SIZE = 1e6 + 5;
    int n;
    int dp[SIZE];
    
    int main()
    {
    	scanf("%d",&n);
    	for(int i = 1;i <= n;i++)
    	{
    		if(i < 5) dp[i] = dp[i - 1] + 1;
    		if(i >= 5 && i < 11) dp[i] = min(dp[i - 1],dp[i - 5]) + 1;
    		if(i >= 11) dp[i] = min(min(dp[i - 1],dp[i - 5]),dp[i - 11]) + 1;
    	}
    	printf("%d",dp[n]);
    	return 0;
    }
    
    • 1

    Information

    ID
    7699
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    2
    Tags
    # Submissions
    21
    Accepted
    11
    Uploaded By