zoukankan      html  css  js  c++  java
  • 1725最少硬币问题(DP)

    Description

    设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。
    对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
    对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,计算找钱m的最少硬币数。

    Input

    输入数据第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1行是要找的钱数m。

    Output

    输出数据只有一个整数,表示计算出的最少硬币数。问题无解时输出-1。

    Sample

    Input 

    3
    1 3
    2 3
    5 3
    18

    Output 

    5
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string>
     4 #include <string.h>
     5 #include <algorithm>
     6 #include <math.h>
     7 #include <map>
     8 #include <vector>
     9 
    10 #define inf 0x3f3f3f3f
    11 
    12 using namespace std;
    13 
    14 struct node
    15 {
    16     int data, num;
    17 } mone[15];
    18 
    19 int dp[20005], book[20005];
    20 
    21 int main()
    22 {
    23     int n, m, i, j, k;
    24     cin >> n;
    25     for(i=0; i<n; i++)
    26     {
    27         cin >> mone[i].data >> mone[i].num;
    28     }
    29     cin >> m;
    30     memset(dp, inf, sizeof(dp));
    31     memset(book, 0, sizeof(book));
    32     dp[0] = 0;
    33     book[0] = 1;
    34     for(i=0;i<n;i++)
    35     {
    36         for(j=0;j<mone[i].num;j++)
    37         {
    38             for(k=m;k>=mone[i].data;k--)
    39             {
    40                 if(dp[k-mone[i].data]+1 < dp[k])
    41                 {
    42                     dp[k] = dp[k-mone[i].data] + 1;
    43                     book[k] = 1;
    44                 }
    45             }
    46         }
    47     }
    48     if(book[m]==0) cout << "-1" << endl;
    49     else cout << dp[m] << endl;
    50     return 0;
    51 }
  • 相关阅读:
    Linux文件权限
    Linux命令
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/14090005.html
Copyright © 2011-2022 走看看