Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- TESKO PUTOVANJE
- OPIS:
- Obitelj Klobucic ide sa svojom prodociom na godisnji odmor u Francusku na putu su
- olducili posjetit Gardeland. Svaki clan obitelji ce iskljucivo ici na voznju ako
- ide clan obitelji kojeg on najvise voli i svi koji njega najvise vole. Ako netko
- nevoli nikoga i ako nije upoce voljen, on takodjer moze ici na voznju. Svaka voznja
- imam maksimalnu kilazu osoba koje moze podnjeti. Ako nam je poznato makismlano
- opterecenje voznje i tezina svakog clana obitelji te tko koga najvise voli,
- odredi maksimalan broj clanova obitelji koji se mogu vozit.
- ULAZ:
- U prvom redu nalaze se brojevi N (1 <= n < 1000)i K (10 <= k <= 1000). N je broj
- clanova obitelji, a K maksimalna kilaza voznje. U drugom redu nalazi se N
- prirodnoih brojeva manjih od 200 opisujuci tezinu pojedinog clana obitelji.
- U sljedecih N redaka nalazi se osoba koju najvise voli N-ti clan obitelji.
- Ako e u N-tom retku nalazi broj 0, ta osoba ne voli nikoga.
- IZLAZ:
- Maksimalan broj clanova obitelji koji moze na voznju.
- TEST PRIMJER_1:
- 5 200
- 50 50 50 50 50
- 3
- 1
- 2
- 0
- 4
- RIJESENJE:
- 4
- TEST PRIMJER_2:
- 6 300
- 50 50 50 50 50
- 3
- 1
- 2
- 0
- 5
- 4
- RIJESENJE:
- 6
- */
- #include <stdio.h>
- #define MAX 1011
- int n, k, p, sum;
- int love[MAX];
- int weight[MAX];
- int visited[MAX];
- int DP[MAX];
- int comp_sum[MAX];
- int comp_weight[MAX];
- int max(int a, int b) {
- if (a > b)
- return a;
- return b;
- }
- int rek(int x) {
- int ret = weight[x];
- visited[x] = 1;
- ++sum;
- if (love[x] && !visited[love[x]])
- ret += rek(love[x]);
- return ret;
- }
- int main() {
- int i, j, tmp;
- scanf("%d %d", &n, &k);
- for (i = 1; i <= n; ++i)
- scanf("%d", weight + i);
- for (i = 1; i <= n; ++i)
- scanf("%d", love + i);
- for (i = 1; i <= n; ++i)
- if (!visited[i]) {
- sum = 0, tmp = rek(i);
- if (tmp <= k) {
- comp_weight[p] = tmp;
- comp_sum[p++] = sum;
- }
- }
- int res = 0;
- for (i = 0; i < p; ++i)
- for (j = k - comp_weight[i]; j >= 0; j--) {
- DP[j + comp_weight[i]] = max(DP[j + comp_weight[i]], DP[j] + comp_sum[i]);
- res = max(res, DP[j + comp_weight[i]]);
- }
- printf("%d\n", res);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement