Advertisement
Guest User

=fasdfs

a guest
Apr 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 KB | None | 0 0
  1. /*
  2.                         TESKO PUTOVANJE
  3.  
  4. OPIS:
  5. Obitelj Klobucic ide sa svojom prodociom na godisnji odmor u Francusku na putu su
  6. olducili posjetit Gardeland. Svaki clan obitelji ce iskljucivo ici na voznju ako
  7. ide clan obitelji kojeg on najvise voli i svi koji njega najvise vole. Ako netko
  8. nevoli nikoga i ako nije upoce voljen, on takodjer moze ici na voznju. Svaka voznja
  9. imam maksimalnu kilazu osoba koje moze podnjeti. Ako nam je poznato makismlano
  10. opterecenje voznje i tezina svakog clana obitelji te tko koga najvise voli,
  11. odredi maksimalan broj clanova obitelji koji se mogu vozit.
  12.  
  13. ULAZ:
  14. U prvom redu nalaze se brojevi N (1 <= n < 1000)i K (10 <= k <= 1000). N je broj
  15. clanova obitelji, a K maksimalna kilaza voznje. U drugom redu nalazi se N
  16. prirodnoih brojeva manjih od 200 opisujuci tezinu pojedinog clana obitelji.
  17. U sljedecih N redaka nalazi se osoba koju najvise voli N-ti clan obitelji.
  18. Ako e u N-tom retku nalazi broj 0, ta osoba ne voli nikoga.
  19.  
  20. IZLAZ:
  21. Maksimalan broj clanova obitelji koji moze na voznju.
  22.  
  23. TEST PRIMJER_1:
  24. 5 200
  25. 50 50 50 50 50
  26. 3
  27. 1
  28. 2
  29. 0
  30. 4
  31.  
  32. RIJESENJE:
  33. 4
  34.  
  35. TEST PRIMJER_2:
  36. 6 300
  37. 50 50 50 50 50
  38. 3
  39. 1
  40. 2
  41. 0
  42. 5
  43. 4
  44.  
  45. RIJESENJE:
  46. 6
  47. */
  48. #include <stdio.h>
  49. #define MAX 1011
  50.  
  51. int n, k, p, sum;
  52.  
  53. int love[MAX];
  54. int weight[MAX];
  55. int visited[MAX];
  56.  
  57. int DP[MAX];
  58. int comp_sum[MAX];
  59. int comp_weight[MAX];
  60.  
  61. int max(int a, int b) {
  62.     if (a > b)
  63.         return a;
  64.     return b;
  65. }
  66.  
  67. int rek(int x) {
  68.     int ret = weight[x];
  69.     visited[x] = 1;
  70.     ++sum;
  71.    
  72.     if (love[x] && !visited[love[x]])
  73.         ret += rek(love[x]);
  74.        
  75.     return ret;
  76. }
  77.  
  78. int main() {
  79.  
  80.     int i, j, tmp;
  81.     scanf("%d %d", &n, &k);
  82.     for (i = 1; i <= n; ++i)
  83.         scanf("%d", weight + i);
  84.     for (i = 1; i <= n; ++i)
  85.         scanf("%d", love + i);
  86.        
  87.     for (i = 1; i <= n; ++i)
  88.         if (!visited[i]) {
  89.             sum = 0, tmp = rek(i);
  90.             if (tmp <= k) {
  91.                     comp_weight[p] = tmp;
  92.                     comp_sum[p++] = sum;
  93.             }
  94.         }
  95.  
  96.     int res = 0;
  97.     for (i = 0; i < p; ++i)
  98.         for (j = k - comp_weight[i]; j >= 0; j--) {
  99.                 DP[j + comp_weight[i]] = max(DP[j + comp_weight[i]], DP[j] + comp_sum[i]);
  100.                 res = max(res, DP[j + comp_weight[i]]);
  101.         }
  102.        
  103.     printf("%d\n", res);
  104.  
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement