• 动态规划2.2 硬币找零


    问题:

      假设我们有几种不同币值的硬币,v1、v2、......、vn,如果我们要支付w元,求最少需要多少个硬币?

      假设有三种不同的硬币,1元、3元、5元。

     代码:

     

     1 #include <iostream>
     2 #include <string.h>
     3 
     4 int main()
     5 {
     6     int value[3] = {1, 3, 5};   // 三种面值的硬币
     7      
     8     // 假设要支付w元。则最多需要w个硬币,因为最小面值为1元。
     9     #define w 9
    10     
    11     int states[w][w+1] = {0};  // 用于记录到达某个节点时所使用的硬币的数量
    12     for(int i = 0; i < w; i++) // 初始化为一个较大的值
    13         for(int j = 0; j < w + 1; j++)
    14             states[i][j] = 0xffff;
    15     
    16     int matrix[w][w+1] = {0};  // 用于记录总的钱数
    17     
    18     matrix[0][1] = 1;
    19     matrix[0][3] = 1;
    20     matrix[0][5] = 1;
    21     
    22     states[0][1] = 1;
    23     states[0][3] = 1;
    24     states[0][5] = 1;
    25     int num = 0;
    26     for(int i = 1; i < w; i++)
    27     {
    28         for(int j = 0; j < w + 1; j++)
    29         {
    30             for(int k = 0; k < sizeof(value) / sizeof(int); k++)
    31             {
    32                 if(matrix[i-1][j] == 1)
    33                 {
    34                     if(matrix[i-1][j] + value[k] < w + 1)
    35                     {
    36                         if(states[i-1][j] == 0xffff)
    37                         {
    38                             states[i][j + value[k]] = 1;
    39                             matrix[i][j + value[k]] = 1; 
    40                             if(j + value[k] == w)
    41                             {
    42                                 std::cout << "j :" << j << ", k :" << k << std::endl;
    43                                 num = states[i][w];
    44                                 goto end;
    45                             }
    46                         }
    47                         else if(states[i-1][j] + 1 < states[i][j+value[k]])
    48                         {
    49                             states[i][j + value[k]] = states[i-1][j] + 1;
    50                             matrix[i][j + value[k]] = 1; 
    51                             if(j + value[k] == w)
    52                             {
    53                                 std::cout << "j :" << j << "k :" << k << std::endl;
    54                                 num = states[i][w];
    55                                 goto end;
    56                             }
    57                         }
    58                     }
    59                 }    
    60             }
    61         }
    62     }
    63     end:
    64     
    65     std::cout << "num : " << num << std::endl;
    66     
    67     return 0;
    68 }

    运行结果:

    下面的实现比较简洁:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <vector>
     4 
     5 int min3(int a, int b, int c)
     6 {
     7     return std::min( std::min(a, b), c );
     8 }
     9 
    10 int min_coin(int money)
    11 {
    12     //{0, 1, 2, 1, 2, 1};    币值为0 1 2 3 4 5时对应的找零硬币个数
    13     
    14     std::vector<int> s(money + 1, 0);
    15     s[0] = 0;
    16     s[1] = 1;
    17     s[2] = 2;
    18     s[3] = 1;
    19     s[4] = 2;
    20     s[5] = 1;
    21     
    22     for(int i = 6; i < money + 1; i++)
    23     {
    24         s[i] = min3(s[i - 1], s[i - 3], s[i - 5]) + 1;
    25     }
    26     
    27     return s[money];
    28 }
    29 
    30 int main()
    31 {
    32     int coins = min_coin(9); // 9元找零
    33     
    34     std::cout << "coins : " << coins << std::endl;
    35     
    36     return 0;
    37 }

    运行结果:

  • 相关阅读:
    5 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之生产环境下drbd裂脑处理
    elk系列8之logstash+redis+es的架构来收集apache的日志
    elk系列7之通过grok分析apache日志
    elk系列6之tcp模块的使用
    elk系列5之syslog的模块使用
    elk系列4之kibana图形化操作
    elk系列3之通过json格式采集Nginx日志
    elk系列2之multiline模块的使用
    Docker探索系列2之镜像打包与DockerFile
    elk系列1之入门安装与基本操作
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13494490.html
Copyright © 2020-2023  润新知