Advertisement
Caio_25

Moedas PD

May 1st, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include<stdio.h>
  2.  
  3. #define MAX 50001
  4. #define NAX 101
  5.  
  6. int v[NAX];
  7. int mat[MAX][NAX] = {0};
  8.  
  9. void zerar(int m, int n);
  10. int maior(int a, int b, int c);
  11. int moedas(int m, int n);
  12.  
  13. int main()
  14. {
  15.     int m, n, resul;
  16.  
  17.  
  18.     while( 1 )
  19.     {
  20.          scanf("%d", &m);
  21.          if(m == 0)
  22.          {
  23.              break;
  24.          }
  25.          scanf("%d", &n);
  26.  
  27.          for(int i = 0; i < n; i++)
  28.         {
  29.             scanf("%d", &v[i]);
  30.  
  31.         }
  32.  
  33.         resul = (-1) * moedas(m, n - 1);
  34.  
  35.         if(resul > m)
  36.         {
  37.             printf("Impossivel\n");
  38.         }
  39.  
  40.         else
  41.         {
  42.             printf("%d\n", resul);
  43.  
  44.         }
  45.         zerar(m, n);
  46.     }
  47.  
  48.  
  49.  
  50. }
  51.  
  52. int maior(int a, int b, int c)
  53. {
  54.     int maior;
  55.  
  56.     if(a > b)
  57.     {
  58.         maior = a;
  59.     }
  60.  
  61.     else
  62.     {
  63.         maior = b;
  64.     }
  65.  
  66.     if(c > maior)
  67.     {
  68.         maior = c;
  69.     }
  70.  
  71.     return(maior);
  72. }
  73.  
  74. int moedas(int m, int n)
  75. {
  76.     if(n < 0)
  77.     {
  78.         return((-1) * MAX);
  79.     }
  80.  
  81.     if(m == 0)
  82.     {
  83.         return(0);
  84.     }
  85.  
  86.     mat[m][n-1] = moedas(m, n-1);
  87.  
  88.     if(v[n] <= m)
  89.     {
  90.         if(mat[m-v[n]][n] == 0)
  91.         {
  92.             mat[m-v[n]][n] =  moedas(m - v[n], n);
  93.         }
  94.  
  95.         if(mat[m - v[n]][n-1] == 0)
  96.         {
  97.            mat[m - v[n]][n-1] =  moedas(m - v[n], n - 1);
  98.         }
  99.  
  100.         if(mat[m][n] == 0)
  101.         {
  102.             mat[m][n] =  maior(-1 + mat[m-v[n]][n] , -1 + mat[m - v[n]][n-1] , mat[m][n-1] );
  103.         }
  104.  
  105.         return(mat[m][n]);
  106.     }
  107.  
  108.     else
  109.     {
  110.         return(mat[m][n-1]);
  111.     }
  112. }
  113.  
  114. void zerar(int m, int n)
  115. {
  116.  
  117.     for(int i = 0; i <= m; i++)
  118.     {
  119.  
  120.         for(int j = 0; j < n; j++)
  121.         {
  122.             mat[i][j] = 0;
  123.         }
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement