Cod sursa(job #2217032)

Utilizator NesteazyNastasia Alexandru Nesteazy Data 28 iunie 2018 17:34:05
Problema Loto Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
#include <iostream>
using namespace std;
#define Q 6
long int sol[7]={0};
long int S;
long int pos[101];int N,n;
void swap(long int &x,long int &y)
{
	long int temp;
	temp=x;x=y;y=temp;
}

void read()
{
	ifstream fin("loto.in");
	fin>>N>>S;
	for(int i=1;i<=N;i++)
	fin>>pos[i];
}

void aranjeaza()
{
	for(int i=1;i<N;i++)
	{
		int min=i;
		for(int j=i+1;j<=N;j++)
			if(pos[j]<pos[min]) min=j;
		swap(pos[i],pos[min]);
	}
	
}


void setari()
{
	aranjeaza();
	bool testdebug=1;
	for(int i=N;i>=1&&testdebug;i--)
	{
		if(6*pos[i]>S) n=i;
		else testdebug=0;
	}

}
int kappa=1;
int valid()
{
	for(int i=1;i<=6;i++)
	if(!sol[i]) return 0;
	if(sol[1]+sol[2]+sol[3]+sol[4]+sol[5]+sol[6]==S)
	return 1;
	return 0;
}
int plauzibil(int x)
{
	long int sumtemp=0;
	for(int i=1;i<=x;i++)
	{
		sumtemp+=sol[i];
		if (sumtemp>S) return 0;
	}
	return 1;
}
ofstream fout("loto.out");


bool arerost=1;
void show()
{
	
	for(int i=1;i<=6;i++)
	{
		fout<<sol[i]<<' ';

	}
	arerost=0;
}

int oprire()
{
	long int sumatemp=0;
	for(int i=1;i<=6;i++)
	sumatemp+=sol[i];
	if(sumatemp<S) return 1;
	return 0;
	
}

void back(int k,int test)
{
	for(int i=test;i>=1&&arerost;i--)
	{
		sol[k]=pos[i];
		if(plauzibil(k))
			if(k==6&&valid()) show();
			else if(k==6&&oprire()) arerost=0;else
			back(k+1,i);
			
	}
}


int main()
{
	read();
	setari();
	back(1,n);
	if(arerost) fout<<-1;
	
}