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] << " ";
}
}