最少硬币问题

- 日理万妓 2022-05-27 10:11 289阅读 0赞

最少硬币问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem 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
Sample Output
5
Hint

Source

  1. import java.util.*;
  2. class Main {
  3. static int min(int a, int b) {
  4. return a < b ? a : b;
  5. }
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. Scanner ss = new Scanner(System.in);
  9. int n;
  10. final int mm = 20001;
  11. final int coinnum = 15;
  12. int dp[];
  13. int coin[];
  14. int coinn[];
  15. n = ss.nextInt();
  16. dp = new int[mm + 1];
  17. coin = new int[coinnum];
  18. coinn = new int[coinnum];
  19. for (int i = 1; i <= mm; i++) {
  20. dp[i] = mm;
  21. }
  22. for (int i = 0; i < n; i++) {
  23. coin[i] = ss.nextInt();
  24. coinn[i] = ss.nextInt();
  25. }
  26. int m;
  27. m = ss.nextInt();
  28. int i, j, k;
  29. for (i = 0; i < n; i++) {
  30. for (j = 0; j < coinn[i]; j++) {
  31. for (k = m; k >= coin[i]; k--) {
  32. dp[k] = min(dp[k - coin[i]] + 1, dp[k]);
  33. }
  34. }
  35. }
  36. if (dp[m] == mm)
  37. System.out.println(-1);
  38. else
  39. System.out.println(dp[m]);
  40. ss.close();
  41. }
  42. }

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 硬币问题

    / 给出k中面值的硬币,每种硬币的数量无限,再给一个总金额amount,问最少需要几枚硬币凑出这个金额,如果凑不出,返回-1 dp[i]定义:当目标金额为i时,至少