Sunteți pe pagina 1din 9

//#4009

/*Moș Crăciun pregătește cadourile pentru acest an.

El cunoaște prețurile a n cadouri și are la dispoziție

o sumă de bani S. Ajutați-l să aleagă un număr maxim

de cadouri a căror preț total să nu depășească S și

determinați suma minimă de care mai are nevoie Moș

Crăciun pentru a cumpăra încă un cadou.*/

//greedy

/*#include <iostream>

using namespace std;

int n,S,v[1001];

void QuickSort(int v[],int st,int dr)

if(st<dr)

//pivotul este inițial v[st]

int m=(st+dr)/2;

int aux=v[st];

v[st]=v[m];

v[m]=aux;

int i=st,j=dr,d=0;

while(i<j)

if(v[i]>v[j])

aux=v[i];

v[i]=v[j];

v[j]=aux;

d=1-d;
}

i+=d;

j-=1-d;

QuickSort(v,st,i-1);

QuickSort(v,i+1,dr);

int main()

cin>>n>>S;

for(int i=1;i<=n;i++)

cin>>v[i];

QuickSort(v,1,n);

int k=0;

for(int i=1;i<=n && v[i]<=S;i++)

{k++;

S-=v[i];}

cout<<k<<" ";

if(k==n)

cout<<0<<endl;

else

cout<<v[k+1]-S<<endl;

return 0;

*/

//backtracking

/*#include <iostream>
using namespace std;

int n, st[101], v[101], S, maxim=-1e3-1, bani;

void tipar(int n)

int sum=0, k=0, poz=0;

for (int i=1;i<=n;i++)

if (sum<=v[st[i]])

sum+=v[st[i]];

k++;

poz=st[i];

if (k>maxim) {

maxim=k;

bani=sum-v[poz]-1;

int valid(int k)

for (int i=1;i<k;i++)

if (st[i]==st[k])

return 0;

return 1;

void back(int k)
{

if (k==n+1)

tipar(n);

else

for (int i=1;i<=n;i++)

st[k]=i;

if (valid(k))

back(k+1);

int main()

cin>>n>>S;

for (int i=1;i<=n;i++)

cin>>v[i];

back(1);

cout<<maxim<<" "<<bani;

return 1;

*/

//#2684

/*Se dă un șir de n numere naturale. Șirul poate

fi partiționat în mai multe moduri într-un

număr de subșiruri strict crescătoare. De

exemplu, șirul 4 6 2 5 8 1 3 7 poate fi

partiționat astfel: 4 6 8 (primul subșir),


2 5 7 (al doilea) și 1 3 (al treilea). O

altă modalitate este formând patru subșiruri:

4 5 7, 6 8, 2 3 și 1.*/

//backtracking

/*#include <iostream>

using namespace std;

int st[100001], k, n;

int v[100001];

void init() {

st[k] = 0;

int sucessor() {

if (st[k] < n) {

st[k]++;

return 1;

} else {

return 0;

int valid() {

for (int i = 1; i < k; i++) {

if (st[i] == st[k] && v[i] > v[k]) {

return 0;

}
int nmax = 0;

for (int i = 1; i <= k; i++) {

if (st[i] > nmax + 1) {

return 0;

if (st[i] > nmax) {

nmax = st[i];

return 1;

int solutie() {

return k == n;

void tipar() {

int max = 0;

for (int i = 1; i <= k; i++) {

if (st[i] > max) {

max = st[i];

for (int i = 1; i <= max; i++) {

int nmax = 0;

for (int j = 1; j <= k; j++) {


if (st[j] == i) {

nmax = j;

cout<<"{";

for (int j = 1; j <= k; j++) {

if (st[j] == i) {

if (j == nmax) {

cout<<j<<"} ";

} else {

cout<<j<<", ";

cout<<"\n";

void back() {

int AS = 0;

k = 1; init();

while (k > 0) {

do {} while ((AS = sucessor()) && !valid());

if (AS) {

if (solutie()) {

tipar();

} else {
k++;

init();

} else {

k--;

int main()

cin>>n;

for (int i = 1; i <= n; i++) {

cin>>v[i];

back();

//greedy

#include <iostream>

using namespace std;

int main() {

int n, x, cnt = 0;

cin >> n;

int v[n];

for(int i = 0; i < n; i++) {

cin >> x;
int st = 1, dr = cnt;

while(st <= dr) {

int mij = (st + dr) / 2;

if (v[mij] < x) {dr = mij - 1;}

else {st = mij + 1;}

if(st > cnt) {

v[++cnt] = x;

else {

v[st] = x;

cout << cnt;

*/

S-ar putea să vă placă și