Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Knapsack iz skripte
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 22:03 sri, 18. 3. 2009    Naslov: Knapsack iz skripte Citirajte i odgovorite

Pozdrav svima,

igrom slucaja zatrebao mi je jednostavni algoritmic za rjesavanje problema ranca, pa sam se okoristio kodom iz skripte prof. Mangera.

Elem,

[code:1]#include <stdio.h>

float M[3][6];
int w[3] = {2,3,4};
float p[3] = {1,7,8};

float zero_one_knapsack (int n, int c)
{
int i, j;
for (i=0; i<=n; i++) M[i][0] = 0.0;
for (j=0; j<=c; j++) M[0][j] = 0.0;
for (i=1; i<=n; i++)
for (j=1; j<=c; j++)
{
M[i][j] = M[i-1][j];
if ( j >= w[i] )
if ((M[i-1][j-w[i]] + p[i]) > M[i-1][j]) M[i][j]
= M[i-1][j-w[i]] + p[i];
}
return M[n][c];
}

int main (void)
{
printf ("%f\n",zero_one_knapsack (3, 6));
return 0;
}[/code:1]

daje za rezultat 8 a po skripti bi trebalo biti 9. Je li to dokumentirani "feature", da sada pod temperaturom i antibioticima ne moram debugirati i razbijati glavu trazeci gresku?
Pozdrav svima,

igrom slucaja zatrebao mi je jednostavni algoritmic za rjesavanje problema ranca, pa sam se okoristio kodom iz skripte prof. Mangera.

Elem,

Kod:
#include <stdio.h>

float M[3][6];
int w[3] = {2,3,4};
float p[3] = {1,7,8};

float zero_one_knapsack (int n, int c)
  {
  int i, j;
  for (i=0; i<=n; i++) M[i][0] = 0.0;
    for (j=0; j<=c; j++) M[0][j] = 0.0;
      for (i=1; i<=n; i++)
        for (j=1; j<=c; j++)
          {
          M[i][j] = M[i-1][j];
            if ( j >= w[i] )
              if ((M[i-1][j-w[i]] + p[i]) > M[i-1][j]) M[i][j]
              = M[i-1][j-w[i]] + p[i];
          }
        return M[n][c];
  }
 
int main (void)
  {
  printf ("%f\n",zero_one_knapsack (3, 6));
  return 0;
  }


daje za rezultat 8 a po skripti bi trebalo biti 9. Je li to dokumentirani "feature", da sada pod temperaturom i antibioticima ne moram debugirati i razbijati glavu trazeci gresku?



_________________
Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 0:57 sri, 22. 4. 2009    Naslov: Citirajte i odgovorite

Od sto glasa i silnih petica u indexu, ah...

No dobro. Ako ce ikome ustrebati, evo citav kod (ispravljena funkcija zero_one_knapsack iz skripte) s dinamickom alokacijom svih parametara (kapacitet ranca, broj objekata i njihova tezina i cijena) [strike]no i bez provjere uspjesne alokacije istih (koga veseli, siroko vam if polje)[/strike].

[code:1]#include <stdio.h>
#include <stdlib.h>

double zero_one_knapsack (int n, int c, double **M, int *w, double *p)
{
int i, j;
for (i=0; i<=n; i++)
M[i][0] = 0;
for (j=0; j<=c; j++)
M[0][j] = 0;
for (i=1; i<=n; i++)
for (j=1; j<=c; j++)
{
M[i][j] = M[i-1][j];
if ( j >= w[i-1] )
if ((M[i-1][j-w[i-1]] + p[i-1]) > M[i-1][j])
M[i][j] = M[i-1][j-w[i-1]] + p[i-1];
}
return M[n][c];
}

int main (void)
{
int c, n, i, s_err;

printf ("Enter number of objects: ");
s_err = scanf ("%d", &n);
if (s_err != 1)
{
fprintf (stderr, "Error inputing number of objects, terminating...\n");
exit(-2);
}

printf ("Enter knapsack capacity: ");
s_err = scanf ("%d", &c);
if (s_err != 1)
{
fprintf (stderr, "Error inputing capacity, terminating...\n");
exit(-2);
}

double **M = malloc ((n + 1) * sizeof *M);
for (i = 0 ; i < n + 1; i++)
if ((M[i] = malloc ((c + 1) * sizeof *M[i])) == NULL)
break;
int *w = malloc (n * sizeof (w));
double *p = malloc (n * sizeof (p));

if (i != n + 1 || M == NULL || p == NULL || w == NULL)
{
fprintf (stderr, "Error allocating memory, terminating...\n");
exit(-1);
}

for (i = 0 ; i < n ; i++)
{
printf ("Enter weight of %d. object: ", i+1);
s_err = scanf ("%d", w+i);
if (s_err != 1)
{
fprintf (stderr, "Error inputing weight, terminating...\n");
exit(-2);
}
}

for (i = 0 ; i < n ; i++)
{
printf ("Enter value (price) of %d. object: ", i+1);
s_err = scanf ("%lf", p+i);
if (s_err != 1)
{
fprintf (stderr, "Error inputing weight, terminating...\n");
exit(-2);
}
}

printf ("%lf\n",zero_one_knapsack (n, c, M, w, p));

for (i = 0 ; i < n + 1 ; i++)
free(M[i]);
free(M); free(w); free(p);

return 0;
}

[/code:1]

HTH,

Bubba

[size=7]Ljepiti kod po forumu u dva ujutro je glupo. Evo ispravljena verzija. Valjda je sada sve OK... :) Edit2: eto, opet nova, doradjenija i malo portabilnija verzija...[/size]
Od sto glasa i silnih petica u indexu, ah...

No dobro. Ako ce ikome ustrebati, evo citav kod (ispravljena funkcija zero_one_knapsack iz skripte) s dinamickom alokacijom svih parametara (kapacitet ranca, broj objekata i njihova tezina i cijena) no i bez provjere uspjesne alokacije istih (koga veseli, siroko vam if polje).

Kod:
#include <stdio.h>
#include <stdlib.h>

double zero_one_knapsack (int n, int c, double **M, int *w, double *p)
{
   int i, j;
   for (i=0; i<=n; i++)
      M[i][0] = 0;
   for (j=0; j<=c; j++)
      M[0][j] = 0;
   for (i=1; i<=n; i++)
      for (j=1; j<=c; j++)
      {
         M[i][j] = M[i-1][j];
         if ( j >= w[i-1] )
            if ((M[i-1][j-w[i-1]] + p[i-1]) > M[i-1][j])
               M[i][j]   = M[i-1][j-w[i-1]] + p[i-1];
      }
   return M[n][c];
}

int main (void)
{
   int c, n, i, s_err;

   printf ("Enter number of objects: ");
   s_err = scanf ("%d", &n);
   if (s_err != 1)
   {
      fprintf (stderr, "Error inputing number of objects, terminating...\n");
      exit(-2);
   }
   
   printf ("Enter knapsack capacity: ");
   s_err = scanf ("%d", &c);
   if (s_err != 1)
   {
      fprintf (stderr, "Error inputing capacity, terminating...\n");
      exit(-2);
   }

   double **M = malloc ((n + 1) * sizeof *M);
   for (i = 0 ; i < n + 1; i++)
      if ((M[i] = malloc ((c + 1) * sizeof *M[i])) == NULL)
         break;
   int *w = malloc (n * sizeof (w));
   double *p = malloc (n * sizeof (p));
   
   if (i != n + 1  || M == NULL || p == NULL || w == NULL)
   {
      fprintf (stderr, "Error allocating memory, terminating...\n");
      exit(-1);
   }
   
   for (i = 0 ; i < n ; i++)
   {
      printf ("Enter weight of %d. object: ", i+1);
      s_err = scanf ("%d", w+i);
      if (s_err != 1)
      {
         fprintf (stderr, "Error inputing weight, terminating...\n");
         exit(-2);
      }
   }

   for (i = 0 ; i < n ; i++)
   {
      printf ("Enter value (price) of %d. object: ", i+1);
      s_err = scanf ("%lf", p+i);
      if (s_err != 1)
      {
         fprintf (stderr, "Error inputing weight, terminating...\n");
         exit(-2);
      }
   }

   printf ("%lf\n",zero_one_knapsack (n, c, M, w, p));

   for (i = 0 ; i < n + 1 ; i++)
      free(M[i]);
   free(M); free(w); free(p);
   
   return 0;
}



HTH,

Bubba

Ljepiti kod po forumu u dva ujutro je glupo. Evo ispravljena verzija. Valjda je sada sve OK... Smile Edit2: eto, opet nova, doradjenija i malo portabilnija verzija...



_________________
Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan