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. }  
  • 相关阅读:
    Json基本使用方法
    Java编程思想(20170818)
    FireFox加载Lodop控件
    泛型
    设计模式原则
    设计模式
    设计模式3.1:简单工厂模式
    设计模式2,模板方法
    spring -- AutoCloseable 作用
    spring 源码方法概要
  • 原文地址:https://www.cnblogs.com/Chicago/p/9426670.html
Copyright © 2011-2022 走看看