VasilM

3b_money

Dec 8th, 2012
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. //#include <stdio.h>
  4.  
  5. #define MAX_ADDS 100000
  6.  
  7. /* Сума, която ще разбиваме */
  8. //const unsigned n = 25;
  9. /* Брой различни стойности на монетите */
  10. const unsigned gN = 7;
  11. /* Стойности на монетите */
  12. const unsigned given[] = { 200, 100, 50, 20, 10, 5, 2 };
  13.  
  14. unsigned mp[MAX_ADDS], count=0, n;
  15. /*
  16. void print(unsigned lenght)
  17. { unsigned i;
  18.   for (i = 1; i < lenght; i++) printf("%u + ", mp[i]);
  19.   printf("%d\n", mp[lenght]);
  20. }
  21. */
  22. void devNum(unsigned n, unsigned pos)
  23. { unsigned k, p;
  24.   for (p = gN; p > 0; p--) {
  25.     k = given[p - 1];
  26.     if (n > k) {
  27.       mp[pos] = k;
  28.       if (mp[pos] <= mp[pos - 1]) devNum(n - k, pos + 1);
  29.     }
  30.     else if (n == k) {
  31.       mp[pos] = k;
  32.       if (mp[pos] <= mp[pos - 1]) count++;// print(pos);
  33.     }
  34.   }
  35. }
  36.  
  37. int main(void) {
  38.  
  39.     while( cin >> n ){
  40.         mp[0] = n + 1;
  41.         devNum(n, 1);
  42.         cout << count << " ";
  43.         count = 0;
  44.     }
  45.  
  46.   return 0;
  47. }
  48. /*
  49. Задача 3b. [1.3.4, стр. 87, devnum3.c]
  50. Да се намерят всички разбивания на дадена сума в лева на банкноти (200, 100, 50, 20, 10, 5, 2 лева).
  51.  
  52. Вход:
  53. Задава се редица цели положителни числа (< 10000 лева) - дадените суми.
  54.  
  55. Изход:
  56. За всеки елемент на редицата се извежда число - броят на всички възможни разбивания.
  57.  
  58. Пример:
  59. 25 11 10
  60.  
  61. Решение на примера:
  62. 7 1 3
  63.  
  64. Обосновка: 20+5, 10+10+5, 10+5+5+5, 5+5+5+5+5, 10+5+2+2+2+2+2, 5+5+5+2+2+2+2+2, 5+2+2+2+2+2+2+2+2+2+2
  65. */
Add Comment
Please, Sign In to add comment