Cerinţa
Gigel a primit cadou n
bețe de diferite lungimi. Neștiind ce să facă cu ele, se întreabă dacă poate alege dintre bețele date o parte, astfel încât, lipindu-le, să obțină un băț de lungime S
.
Date de intrare
Fişierul de intrare bete.in
conţine pe prima linie numerele n S
, separate printr-un spațiu, iar pe a doua linie n
numere naturale separate prin spaţii, reprezentând lungimile bețelor.
Date de ieşire
Fişierul de ieşire bete.out
va conţine pe prima linie mesajul DA
, dacă pot fi alese bețe astfel încât lungimea totală a lor să fie S
, și NU
în caz contrar. Dacă este posibilă alegerea bețelor, urmează o alegere posibilă: pe linia a doua a fișierului se va afla un număr m
, numărul de bețe alese; pe linia a treia se vor afla m
numere distincte cuprinse între 1
și n
, reprezentând numerele de ordine ale bețelor alese astfel încât suma lungimilor să fie S
.
Restricţii şi precizări
1 ≤ n ≤ 100
- numerele de pe a doua linie a fişierului de intrare vor fi numere naturale nenule mai mici decât 100
Exemplu 1:
bete.in
5 10 1 5 3 6 8
bete.out
DA 3 1 3 4
Exemplu 2:
bete.in
5 21 1 5 3 6 8
bete.out
NU
#include <bits/stdc++.h> using namespace std; ifstream cin("bete.in"); ofstream cout("bete.out"); int n , L , maxi , T[10001] , a[101] , rez[10001] , cnt , afis[10001]; void dinamica() { for(int i = 1 ; i <= n ; i++) { for(int j = maxi ; j >= 0 ; j--) if(T[j] != 0 && j + a[i] <= L) T[j + a[i]] = a[i] , rez[j + a[i]] = i; if(maxi + a[i] < L) maxi += a[i]; else maxi = L; } } int main() { cin >> n >> L; for(int i = 1 ; i <= n ; i++) cin >> a[i]; T[0] = -1; dinamica(); if(T[L] == 0) cout << "NU"; else { cout << "DA\n"; for(int i = L ; i != 0 ;) cnt++ , afis[cnt] = rez[i] , i -= T[i]; cout << cnt << '\n'; for(int i = cnt ; i >= 1 ; i--) cout << afis[i] << " "; } }