Advertisement
Guest User

Untitled

a guest
May 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. import java.util.Scanner;
  2.  
  3. public class ChangeMaker {
  4. public static void main(String[] args) {
  5. int[] result, resultGreedy;
  6. int numberOfCoins, n, numberOfCoinsGreedy;
  7.  
  8. Scanner input = new Scanner(System.in);
  9.  
  10. System.out.println("Enter the number of coins-denominations and the set of coin values:");
  11.  
  12. int k = input.nextInt();
  13. int[] d = new int[k];
  14.  
  15. for (int i = 0; i < k; i++) {
  16. d[i] = input.nextInt();
  17. }
  18.  
  19. do {
  20. numberOfCoins = 0;
  21. numberOfCoinsGreedy = 0;
  22. System.out.println("\nEnter a positive amount to be changed (enter 0 to quit):");
  23. n = input.nextInt();
  24. result = change_DP(n, d);
  25. resultGreedy = change_greedy(n, d);
  26. int[][] printedDP = new int[2][result.length];
  27. int[][] printedGreedy = new int[2][result.length];
  28.  
  29. for (int i = 0; i < result.length; i++) {
  30. numberOfCoins += result[i];
  31. numberOfCoinsGreedy += resultGreedy[i];
  32. if (result[i] > 0) {
  33. printedDP[0][i] = result[i];
  34. printedDP[1][i] = d[i];
  35. printedGreedy[0][i] = resultGreedy[i];
  36. printedGreedy[1][i] = d[i];
  37. }
  38. }
  39.  
  40. System.out.println("\nDP algorithm results");
  41. System.out.println("Amount: " + n);
  42. System.out.print("Optimal coin distribution: ");
  43.  
  44. for (int i = 0; i < printedDP[0].length - 1; i++) {
  45. if (printedDP[0][i] > 0) {
  46. System.out.print(printedDP[0][i] + "*" + printedDP[1][i] + "c + ");
  47. }
  48. }
  49.  
  50. System.out.println(printedDP[0][printedDP[0].length - 1] + "*" + printedDP[1][printedDP[0].length - 1] + "c");
  51. System.out.println("Optimal coin count: " + numberOfCoins);
  52.  
  53. System.out.println("\nGreedy algorithm results");
  54. System.out.println("Amount: " + n);
  55. System.out.print("Optimal coin distribution: ");
  56.  
  57. for (int i = 0; i < printedGreedy[0].length - 1; i++) {
  58. if (printedDP[0][i] > 0) {
  59. System.out.print(printedGreedy[0][i] + "*" + printedGreedy[1][i] + "c + ");
  60. }
  61. }
  62.  
  63. System.out.println(printedGreedy[0][printedGreedy[0].length - 1] + "*" + printedGreedy[1][printedGreedy[0].length - 1] + "c");
  64. System.out.println("Optimal coin count: " + numberOfCoinsGreedy);
  65.  
  66.  
  67. } while (n > 0);
  68.  
  69.  
  70. }
  71.  
  72. public static int[] change_greedy(int n, int[] d) {
  73. int i;
  74. int [] result = new int[d.length];
  75.  
  76. while (n > 0) {
  77. for (i = 0; i < d.length; i++) {
  78. if (d[i] < n) {
  79. break;
  80. }
  81. }
  82.  
  83. result[i] = (n - (n % d[i])) / d[i];
  84. n = n - result[i] * d[i];
  85. }
  86.  
  87. return result;
  88. }
  89.  
  90. public static int[] change_DP(int n, int[] d) {
  91. int[] A = new int[n + 1];
  92. int[] C = new int[n + 1];
  93. int[] B = new int[d.length];
  94.  
  95. C[0] = 0;
  96.  
  97. for (int j = 1; j < n + 1; j++) {
  98. int min = Integer.MAX_VALUE;
  99. int chosen = 0;
  100.  
  101. for (int i = 0; i < d.length; i++) {
  102. if (j >= d[i]) {
  103. if (C[j - d[i]] <= min) {
  104. min = C[j - d[i]];
  105.  
  106. chosen = i;
  107. }
  108. }
  109. }
  110.  
  111. C[j] = 1 + min;
  112. A[j] = chosen;
  113. }
  114.  
  115. while (n > 0) {
  116. B[A[n]] += 1;
  117. n -= d[A[n]];
  118. }
  119. return B;
  120. }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement