Cod sursa(job #2577700)

Utilizator DanielBarbulescuDaniel Barbulescu DanielBarbulescu Data 9 martie 2020 19:04:58
Problema Energii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


void subsetSums(FILE* aux ,int arr[], int l, int r,
	int sum = 0)
{
	if (l > r)
	{
		fprintf(aux,"%d ", sum);
		return;
	}

	subsetSums(aux ,arr, l + 1, r, sum + arr[l]);

	subsetSums(aux,arr, l + 1, r, sum);
}

int main()
{
	FILE* in = fopen("energii.in", "r");
	if(in==NULL)
		{
		printf("Eroare la formarea fisierului de intrare!");
		return 1;
		}
	FILE* out = fopen("energii.out", "w");
	FILE* aux1 = fopen("aux1.txt", "w");

	int n, cost;
	fscanf(in, "%d\n%d", &n,&cost);

	int* costuri = (int*)malloc(sizeof(int) * n);
	int* e = (int*)malloc(sizeof(int) * n);


	for(int i=0;i<n;i++)
		fscanf(in, "%d %d", &e[i],&costuri[i]);

	

	subsetSums(aux1,costuri, 0, n - 1);
	fprintf(aux1,"\n\n");
	subsetSums(aux1,e, 0, n - 1);
	fclose(aux1);
	FILE* aux2 = fopen("aux1.txt", "r");

	int N = pow(2, n);

	int** mat = (int**)malloc(sizeof(int*)*2);
	mat[0] = (int*)malloc(sizeof(int) * N);
	mat[1] = (int*)malloc(sizeof(int) * N);

	for (int i = 0;i < 2*N;i++)
			if(i<N)
			fscanf(aux2, "%d", &mat[0][i]);//pe prima linie o sa am costurile
			else
				fscanf(aux2, "%d", &mat[1][i-N]);

	int t = 0,min,mini;

	for (int i = 0;i < N;i++)
		if ((mat[0][i] >= cost) && (t == 0))
		{
			min = mat[1][i];
			mini = i;
			t = 1;
		}
		else if ((mat[0][i] >= cost) && (min > mat[1][i]))
		{
			min = mat[1][i];
			mini = i;
		}

	if (t != 0)
		fprintf(out, "%d", mat[0][mini]);
	else fprintf(out, "-1");

}