zoukankan      html  css  js  c++  java
  • 动态规划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 }

    运行结果:

  • 相关阅读:
    绝对路径和相对路径的问题
    get请求中的中文乱码问题的解决方法
    jsp中的另一种分页实现方法
    jsp中退出功能实现代码
    jsp中完整的分页显示和页面跳转功能实现的源代码
    jsp中未登录用户也可以浏览页面的功能实现代码
    date和calendar对象的转化,使用,以及插入数据库中的总结
    jsp中向数据库中插入当前时间的方法精确到秒
    硬盘方式安装 Windows 7
    HP笔记本中CQ4x系列,在XP下的未知设备与声卡设备驱动
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13494490.html
Copyright © 2011-2022 走看看