Documente Academic
Documente Profesional
Documente Cultură
1 #include <iostream>
2 #include <vector>
3
4 int main()
5 {
6 int N, K;
7 std::cin >> N >> K;
8
9 std::vector<int> nums;
10 for(int i = 0; i < N; ++i)
11 {
12 int x;
13 std::cin >> x;
14 nums.push_back(x);
15 }
16
17 std::vector<int> dp(K + 1, 0);
18 for(int i = 1; i <= N; ++i)
19 {
20 for(int w = K; w >= 0; --w)
21 {
22 if(nums[i - 1] <= w)
23 {
24 dp[w] = std::max(dp[w], nums[i - 1] + dp[w - nums[i - 1]]);
25 }
26 }
27 }
28
29 std::cout << dp[K] << '\n';
30 }
1
b) Folosim algoritmul polinomial de 1/2-aproximare ca la problema Knapsack
0/1. Se observă că lista de obiecte este deja sortată (indiferent de ordinea
value(x)
numerelor din S), deoarece pentru fiecare obiect x din L, weight(x) = 1.
Complexitatea timp este O(n), complexitatea spat, iu este O(1).
1 #include <iostream>
2 #include <vector>
3
4 int main()
5 {
6 int K;
7 std::cin >> K;
8
9 int S = 0;
10
11 int num;
12 int max_num = -1;
13 while(std::cin >> num)
14 {
15 max_num = std::max(max_num, num);
16
17 if(num <= K)
18 {
19 S += num;
20 K -= num;
21 }
22 }
23
24 std::cout << std::max(S, max_num) << '\n';
25 }
2
Tema 1 – Algoritmi Avansat, i
Nicula Ionut, -Cosmin
Grupa 234
II. LOAD BALANCE
Problema 2
a) S, tim că ALG1 este 2-aproximativ s, i ALG2 este 4-aproximativ, deci:
ALG1 ≤ 2 · OP T
ALG2 ≤ 4 · OP T
ALG1 ≤ 2 · OP T ≤ 2 · ALG1
As, adar, trebuie să răspundem la întrebarea: există un I astfel încât ALG2 (I) ∈
[2 · OP T (I) , 4 · OP T (I)]?
Răspunsul este nu în mod necesar, deoarece, din datele din enunt, , există
posibilitatea ca ALG2 să fie, de fapt, mai bun decât 2-aproximativ, adică:
b)
ALG1 (I) > 2 · ALG2 (I) ⇐⇒ 2 · ALG2 (I) < ALG1 (I) ≤ 2 · OP T (I)
⇐⇒ 2 · ALG2 (I) < 2 · OP T (I)
⇐⇒ ALG2 (I) < OP T (I) (2)
Relat, ia (2) este o contradict, ie, deoarece solut, ia optimă într-o problemă de
minimizare nu poate fi strict mai mare decât o altă solut, ie fezabilă.
As, adar, afirmat, ia că nu există niciun input I a.î. ALG1 (I) > 2 · ALG2 (I)
este adevărată.
Problema 3
Lemă.
1 X n
OP T ≥ max · tj , max {tj | 1 ≤ j ≤ n}
m
j=1
OP T ≥ tm + tm+1
1
Rezolvare:
Fie k indicele mas, inii cu load(k) maxim la finalul planificării activităt, ilor.
Fie q indicele ultimei activităt, i adăugate în mas, ina k.
Fie load′ (i) load-ul mas, inii cu indicele i fix înainte de a adăuga activitatea q
în mas, ina k.
Dacă q ≤ m, atunci ALG = load(k) = tq =⇒ ALG = OP T .
Altfel, daca q > m:
ALG = load(k)
= load′ (k) + tq (3)
tq ≤ tm
tq ≤ tm+1
tm + tm+1
=⇒ tq ≤
2
n
1 X tq
(3) =⇒ load′ (k) + tq ≤ · tj − + tq ≤
m j=1 m
tm + tm+1 tm + tm+1
≤ OP T − + ≤
2m 2
OP T OP T
≤ OP T − + =
2m 2
3m · OP T − OP T
= =
2m
OP T · (3m − 1)
= =
2m
3m − 1
= OP T · (4)
2m
3m − 1 3m 1 3 1
= − = − (5)
2m 2m 2m 2 2m
Din (4) s, i (5) rezultă că factorul de aproximare al algoritmului este 3/2 −
1/(2m).
2
Tema 1 – Algoritmi Avansat, i
Nicula Ionut, -Cosmin
Grupa 234
III. TRAVELLING SALESMAN PROBLEM
Problema 1
a) Considerăm o instant, ă G = (V, E) (graf neponderat) pentru HCP s, i for-
măm un nou graf G′ = (V ′ , E ′ ) (graf complet, ponderat) pentru TSP în
felul următor:
• V′ =V
• cost(u, v) = 1, dacă (u, v) ∈ E
• cost(u, v) = 2, dacă (u, v) ∈
/E
b)
v1
v2 v3 v4 v5 v6
1
Tema 1 – Algoritmi Avansat, i
Nicula Ionut, -Cosmin
Grupa 234
IV. VERTEX COVER
sau
m
^
(x1 ∨ x2j ∨ x2j+1 )
j=1
Eliminând câte un predicat la fiecare iterat, ie, în cel mau rău caz ALG = m.
Deci, algoritmul este m-aproximativ.
b)