Pagini recente » Cod sursa (job #2909673) | Cod sursa (job #36991) | Cod sursa (job #917453) | Cod sursa (job #1819083) | Cod sursa (job #1423026)
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define IN_FILE_NAME "energii.in"
#define OUT_FILE_NAME "energii.out"
#define MAX_G 1002
#define MAX_W 5002
void energii(){
int g;
int w;
int energi[MAX_G];
int cost[MAX_G];
int sume[MAX_W];
int i,j;
int maxSumReached = 0;
int auxSum = 0;
int auxCost = 0;
int maxSumToBe = 0;
int minimumCost = INT_MAX;
FILE *fin;
FILE *fout;
fin = fopen(IN_FILE_NAME,"r");
fout = fopen(OUT_FILE_NAME,"w");
fscanf(fin,"%d",&g);
fscanf(fin,"%d",&w);
for(i = 0 ; i < g; i++){
fscanf(fin,"%d",&energi[i]);
fscanf(fin,"%d",&cost[i]);
}
for(i = 0; i<=w; i++){
sume[i] = INT_MAX;
}
//pentru toate generatoarele, aplic algoritmul de update a sumelor
for(i = 0; i < g; i++){
for(j = maxSumReached; j>=0; j--){
if(sume[j] != INT_MAX){
auxSum = j + energi[i];
auxCost = sume[j] + cost[i];
if(auxSum>=w){
if(auxCost < minimumCost){
minimumCost = auxCost;
}
}
else{
if(auxCost<sume[auxSum]){
sume[auxSum] = auxCost;
if(maxSumToBe < auxSum){
maxSumToBe = auxSum;
}
}
}
}
}
if(sume[energi[i]] > cost[i]){
if(maxSumToBe < energi[i]){
maxSumToBe = energi[i];
}
if(sume[energi[i]] > cost[i]){
sume[energi[i]] = cost[i];
}
}
maxSumReached = maxSumToBe;
}
if(minimumCost > sume[w]){
minimumCost = sume[w];
}
if(minimumCost == INT_MAX){
fprintf(fout,"-1");
}
else {
fprintf(fout,"%d",minimumCost);
}
fclose(fin);
fclose(fout);
}
int main(){
energii();
return 0;
}