algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Problem załadunku - Implementacja w C/C++
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
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();
   }
}
Dodaj komentarz