Pagini recente » Cod sursa (job #2233167) | Cod sursa (job #185923)
Cod sursa(job #185923)
#include <stdio.h>
#define nmax 1005
#define wmax 5005
#define infinit 1000000000
int N, W;
int E[nmax], C[nmax], S[nmax], CMIN[nmax][wmax];
void date()
{
int i;
freopen("energii.in", "r", stdin);
scanf("%d%d", &N, &W);
for (i = 1; i <= N; ++i)
scanf("%d%d", &E[i], &C[i]);
}
void afisaza()
{
freopen("energii.out", "w", stdout);
if (CMIN[N][W] < infinit)
printf("%d\n", CMIN[N][W]);
else
printf("-1\n");
/*int i,j;
for(i=0;i<=N;i++)
{
for(j=0;j<=W;j++)
if(CMIN[i][j]==infinit)printf("* ");
else printf("%d ",CMIN[i][j]);
printf("\n");
}
printf("\n");
*/
}
void rezolva()
{
int i, w;
S[0]=0;
//printf("Sirul S care contine sume partiale este:\n");
for (i = 1; i <= N; ++i)S[i] = S[i-1] + E[i];//printf("%d ",S[i]); }
//printf("\n");
for (w = 1; w <= W; ++w)CMIN[0][w] = infinit;
for (i = 1; i <= N; ++i)
{
for (w = 1; w <= W && w <= S[i]; ++w)
{
CMIN[i][w] = infinit;
//REGULA 1
if (CMIN[i-1][w] < CMIN[i][w])//daca inainte nu a fost infinit
//{
CMIN[i][w] = CMIN[i-1][w];
//printf("Am pus %d pe locul %d %d (adica ce e si de-asupra) conform regulii 1,fiindca inainte nu a fost infinit\n",CMIN[i-1][w],i,w);write();}
//REGULA 2
if (E[i] >= w)//daca energia curenta e suficienta,pentru cat mi-am propus sa ating(w)
{
//si, in plus costul curent este mai mare decat costul dat la intrare
if (CMIN[i][w] > C[i])
// {
CMIN[i][w] = C[i];
//printf("Am pus %d pe locul %d %d conform regulii 2;energia curenta(%d) e sufic pt energia propusa(%d)\n",C[i],i,w,E[i],w);write();}//in matrice incerc sa am costuri minime, energii maxime
}
//REGULA 3
if (E[i] <= w)
//{
//daca energia curenta nu e suficienta
if (CMIN[i][w] > C[i] + CMIN[i-1][w-E[i]])
//printf("\n");
CMIN[i][w] = C[i] + CMIN[i-1][w-E[i]];
//printf("Sunt la linia i=%d coloana w=%d regula 3;w-E[i]=%d-E[%d]=%d-%d\n",i,w,w,i,w,E[i]);
//printf("REGULA 3: am pus CMIN[i][w]=%d",CMIN[i][w],w-E[i]);
//si, in plus,costul curent propuse mai mare decat costul de intrare+
//????
//write();
//}
}
for (w = S[i]+1; w <= W; ++w)
CMIN[i][w] = infinit;
}
}
int main()
{
freopen ("energii.out","w",stdout);
date();
rezolva();
afisaza();
return 0;
}