动态规划凑硬币

Bertha 。 2022-06-08 13:35 274阅读 0赞

题目:几年教师节活动中,公司里为培训讲师提供了不同面值的饮料兑换券(每种面值数量不限),培训讲师可以领取兑换券去食堂兑换鲜榨果汁,要求兑换券和果汁必须等价,姜小虎想要兑换一杯果汁,计算它最少要领取几张兑换券,如果无法兑换返回-1.

输入描述:第一行:兑换券的面值种类(种类>0) 第二行:数组,代表兑换券面值(面值>0) 第三行:一个整数,代表饮料的价值(饮料的价值>0)

输出描述:对于每个测试用例,要求输出最少兑换券张数

这是我在做完美公司笔试的时候遇到的编程题,我自身对动态规划不是很熟悉,当时这道题的数据通过率很低,笔试结束后又重新看了这道题,发现这是一道很经典的凑硬币题,但是有一些细微的点需要注意。

  1. import java.util.Scanner;
  2. /**
  3. * 动态规划
  4. * @author Rose
  5. *
  6. */
  7. public class Main {
  8. static int[] dp;
  9. public static void main(String[] args) {
  10. Scanner in = new Scanner(System.in);
  11. //面值种类
  12. int n = in.nextInt();
  13. int[] money = new int[n];
  14. for (int i = 0; i < n; i++) {
  15. money[i] = in.nextInt();
  16. }
  17. //饮料价值
  18. int value = in.nextInt();
  19. dp = new int[value+1];
  20. getMinCount(money, value, 0);
  21. if(dp[value] == Integer.MAX_VALUE - 1) //第一处:无法兑换
  22. System.out.println(-1);
  23. else
  24. System.out.println(dp[value]);//可以兑换
  25. }
  26. private static int min(int a, int b){
  27. return a>b?b:a;
  28. }
  29. private static void getMinCount(int[] money, int value, int i){
  30. if(i <= value){
  31. //第二处:边界限制
  32. if(i == 0){
  33. //第三处:当i = 0
  34. dp[i] = 0;
  35. getMinCount(money, value, i+1);
  36. return;
  37. }else{
  38. int min = Integer.MAX_VALUE - 1;
  39. for (int j = 0; j < money.length; j++) {
  40. if(i >= money[j])
  41. min = min(dp[i-money[j]] + 1, min);
  42. }
  43. dp[i] = min;
  44. if(i == value)
  45. return;
  46. else
  47. getMinCount(money, value, i+1);
  48. }
  49. }
  50. }
  51. }

上述代码中第一处:代码中为每一个dp[i]都初始化为Integer.MAX_VALUE-1,若经过递归后dp[i]的值还是Integer.MAX_VALUE-1,说明该价值的饮料无法兑换

上述代码第二处:如果不加这个限制,当value = 0时会报错,原因是i= 0时为dp[0]赋值之后转入下一层递归,此时i=1,数组越界

上述代码第三处:当i= 0时要单独赋值

发表评论

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

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

相关阅读

    相关 硬币问题

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

    相关 动态规划硬币

    > 题目:几年教师节活动中,公司里为培训讲师提供了不同面值的饮料兑换券(每种面值数量不限),培训讲师可以领取兑换券去食堂兑换鲜榨果汁,要求兑换券和果汁必须等价,姜小虎想要兑换一

    相关 动态规划 硬币问题

    凑硬币问题 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 用数组d来存储当前每个面值可以对应的合成的最小