Nadesłany przez Michał Knasiecki, 31 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Zaladunek/zaladunek.cpp:
/*
Programowanie dynamiczne: problem zaladunku
Program pobrano ze strony www.algorytm.org
Opracowal: Michal Knasiecki
Nalezy zapoznac sie z plikiem "!!!Format_danych.txt"
********************************************
*UWAGA: Dane sa wczytywane z pliku dane.txt*
********************************************
*/
#include <conio>
#include <stdio>
#include <stdlib>
FILE *plik;
int n; //Liczba typów kontenerów Max=20
int b; //Ladownosc statku Max=30
// Dla jasnosci kodu pomine zerowe indeksy w tablicach
int ciezar[21]; //Tablica ciezarów kontenerów
int pojemnosc[21]; //Tablica pojemnosci kontenerów
int rozwiazanie[21]; //Tablica z rozwiazaniem
int x[21][31]; //Tablica pomocnicza o wymiarze n*b
int f[21][31]; //Tablica pomocnicza o wymiarze n*b
//
void oblicz(void)
{
int l,j;
div_t q;
//
for (l=0;l<=b;l++)
{
q=div(l,ciezar[1]);
f[1][l]=pojemnosc[1]*q.quot;
if (f[1][l]==0) x[1][l]=0; else x[1][l]=1;
}
for (j=2;j<=n;j++)
{
for (l=1;l<=b;l++)
{ //Uroczy wzorek:
if (l-ciezar[j]<0) f[j][l]=f[j-1][l]; else
if (f[j-1][l]>f[j][l-ciezar[j]]+pojemnosc[j]) f[j][l]=f[j-1][l];
else f[j][l]=f[j][l-ciezar[j]]+pojemnosc[j];
if (l-ciezar[j]<0) x[j][l]=x[j-1][l];
else if (f[j-1][l]>f[j][l-ciezar[j]]+pojemnosc[j]) x[j][l]=x[j-1][l]; else
x[j][l]=j;
}
}
j=b;
do
{
rozwiazanie[x[n][j]]++;
j=j-ciezar[x[n][j]];
}
while ((j>0)&&(ciezar[x[n][j]]!=0));
//Wypisywanie rozwiazania:
printf("Roziwiazanie:\n");
for (j=1;j<=n;j++) printf("Typ: %i, Ilosc: %i\n",j,rozwiazanie[j]);
}
void main(void)
{
int i;
//
clrscr();
if ((plik=fopen("dane.txt","r"))==NULL)
{
printf("Plik \"dane.txt\" z danymi wejsciowymi nie istnieje\n");
printf("Dowlony klawisz...");
getch();
} else
{ //Wczytywanie danych z pliku
printf("Dane wejsciowe:\n");
fscanf(plik,"%i",&n);
printf("Liczba typow kontenerow: %i\n",n);
fscanf(plik,"%i",&b);
printf("Ladownosc statku: %i\n",b);
for (i=0;i<n;i++)
{
fscanf(plik,"%i",&ciezar[i+1]);
printf("Ciezar konteneru #%i: %i\n",i+1,ciezar[i+1]);
}
for (i=0;i<n;i++)
{
fscanf(plik,"%i",&pojemnosc[i+1]);
printf("Pojemnosc konteneru #%i: %i\n",i+1,pojemnosc[i+1]);
}
fclose(plik);
oblicz();
getch();
}
}

