Pagini recente » Cod sursa (job #894119) | Cod sursa (job #2177753) | Cod sursa (job #2584435) | Cod sursa (job #706350) | Cod sursa (job #664777)
Cod sursa(job #664777)
Utilizator |
romario s8ko14 |
Data |
20 ianuarie 2012 19:35:07 |
Problema |
Gutui |
Scor |
10 |
Compilator |
cpp |
Status |
done |
Runda |
teme_upb |
Marime |
1.93 kb |
#include<stdio.h>
int n,in_max,ridicare,smax=0;
struct fruct
{
int inaltime;
int greutate;
int poz;//pozitia gutuii
};
fruct a[100],copie[100],sol[100],b[100];
int bun(int k)
{
for(int i=0;i<k;i++)
if(sol[i].poz==sol[k].poz)
return 0;
for(int i=0;i<n;i++)//aici ridic gutuile cu "ridicare" si daca le am ridicat prea mult transform inaltimea gutuii in -1
if(copie[i].inaltime>=0)
{
if(copie[i].inaltime!=-1)
copie[i].inaltime=copie[i].inaltime+ridicare;
if(copie[i].inaltime>in_max)
copie[i].inaltime=-1;
}
return 1;
}
int reinitializare_copie(int k)
{
for(int i=0;i<n;i++)//copiez in copie vectoru a
{
copie[i].inaltime=a[i].inaltime;
copie[i].greutate=a[i].greutate;
}
for(int i=0;i<n;i++)//ridic gutuile de atatea ori de cate pozitii am completate in vectorul sol
copie[i].inaltime=copie[i].inaltime+ridicare*k;
}
int solutie(int k,int &s)//este solutie daca nu mai pot ridica nici o gutuie , toate fiind prea sus
{
s=0;
for(int i=0;i<=k;i++)
{
s=s+sol[i].greutate;
if(copie[i].inaltime!=-1)
return 0;
}
return 1;
}
void retin_suma(int s)
{
if(s>smax)
smax=s;
}
int back(int k)
{
int s;
for(int i=0;i<n;i++)
{
if(copie[i].inaltime!=-1)
{ sol[k].inaltime=copie[i].inaltime; sol[k].greutate=copie[i].greutate; sol[k].poz=i; }//completez vectorul sol
if(bun(k))
if(solutie(k,s))//este solutie daca nu mai pot ridica nici o gutuie , toate fiind prea sus
{
retin_suma(s);
reinitializare_copie(k);
}
else
back(k+1);
}
}
int main()
{
FILE *f=fopen("gutui.in","rt");
FILE *g=fopen("gutui.out","wt");
fscanf(f,"%i%i%i",&n,&in_max,&ridicare);
for(int i=0;i<n;i++)
fscanf(f,"%i%i",&a[i].inaltime,&a[i].greutate);
for(int i=0;i<n;i++)//copiez pe a(vectoru care retine gutuile) in copie
{ copie[i].inaltime=a[i].inaltime; copie[i].greutate=a[i].greutate; }
back(0);
fprintf(g,"%i",smax);
}