zoukankan      html  css  js  c++  java
  • [DP]硬币问题

    今天再写一下硬币问题 为什么是再呢

    这是个很羞耻的话题 昨天写了一遍硬币

    在某谷上跑 没错 挂掉了 TLE MD_SB

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    有很多人说硬币问题是贪心去做

    如果你遇到的测试点不呢么毒瘤

    例1: 硬币的面值是 1 5 10 要凑出15元 min(硬币个数)

    解1:(贪心)每次选最大 min=2

    显然是可以得到正确答案的

    但是如果硬币的面值是

    例2:硬币的面值是 1 5 11 要凑出15元 min(硬币个数)

    解2:(贪心)每次选最大 min=5

    显然这是错误的 min应该等于3 三个五元

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    所以说 以后我们看到硬币问题的时候

    一定不要再深陷于贪心 要多考虑几组测试数据

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    DP常规思路:1、设计状态 f(n)为n元需要的最少硬币数

                2、写状态转移方程

                f(n)= min(f(n-1),f(n-5),f(n-11))+1

        但是这题我们要注意一下 不能直接把状态转移方程带入

        因为如果n=4 呢n-5,n-11是不是小于零啊

        这时候我们加一个中间变量和判断就ojbk了

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    现在我们代码实现一下:

    1. #include<iostream>  
    2. #include<cstdio>  
    3. #define N 2333333   
    4. using namespace std;  
    5. int dp[100010],cost,m;  
    6. int min(int x,int y){  
    7.     return x>=y?y:x;  
    8. }   
    9.     
    10. int main(){  
    11.     scanf("%d",&m);  
    12.     cost=N;  
    13.     dp[0]=0;  
    14.     for(int i=1;i<=m;i++)  
    15.     {  
    16.         dp[i]=N;  
    17.         if(i-1 >= 0) dp[i]=min(dp[i],dp[i-1]+1);  
    18.         if(i-5 >= 0) dp[i]=min(dp[i],dp[i-5]+1);  
    19.         if(i-11 >= 0) dp[i]=min(dp[i],dp[i-11]+1);  
    20.         printf("dp[%d] =%d ",i,dp[i]);  
    21.     }  
    22.     //tmd终于过了 201885 10:56   
    23.     return 0;  
    24. }  
  • 相关阅读:
    点击listview 的列头对其item进行自动排序
    将选择的图片显示在listview中,并显示filename,path和type
    【翻译】8 个可以节省时间的 C# 开发相关工具
    【原创】关于乘法运算的新思路
    【翻译】为什么我们要用抽象类?
    【翻译】如何使用 C# 的 BackgroundWorker
    【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
    关于C#日期格式化问题
    C#获取(大陆)身份证基本信息的算法
    C#关于精确年龄的算法(精确到天)
  • 原文地址:https://www.cnblogs.com/Chicago/p/9426670.html
Copyright © 2011-2022 走看看