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 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/14090005.html