Cześć!
Piszę program, który na podstawie dwóch wartości (czas i atrakcyjność) wybierze najlepszą kombinację miejsc do odwiedzenia w określonym czasie. Pierwsze kroki w programowaniu dynamicznym. Całość mniej więcej hula, ale w linijkach, które zamknąłem w komentarzu (/*...*/) znajduje się coś, co doprowadza do błędu 3221225725 (stack overflow). Ma ktoś jakiś pomysł? :)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
void wybor(double tab[][2], int n);
int main(int argc, char** argv) {
int n, program, metoda;
double nominaly[n][2], egipt[5][2], czas;
string miejsca[5];
cout<<"Wybierz program:\n1. Nominaly\n2. Egipt\n";
cin>>program;
cout<<"Wybierz metode:\n1. Zachlanna\n2. Dynamiczna\n";
cin>>metoda;
cout<<endl;
switch(program) {
case 1:
double kwota;
cout<<"Podaj liczbe wykorzystywanych nominalow: ";
cin>>n;
cout<<"\nWpisz dostepne nominaly oddzielajac je znakiem ENTER: \n\n";
for(int i=0; i<n; i++) {
cout<<i+1<<". ";
cin>>nominaly[i][0];
}
wybor(nominaly, n);
cout.precision(15);
cout<<"\nPodaj kwote do zwrocenia (czesci dziesietne oddziel kropka, a nie przecinkiem): ";
cin>>kwota;
int ile;
for(int i=n-1; i>=0; i--) {
ile=0;
while(kwota>=nominaly[i][0]) {
kwota-=nominaly[i][0];
ile++;
nominaly[i][1]=ile;
}
}
if(kwota<0.01) kwota=0;
if(kwota==0) {
for(int i=n-1; i>=0; i--) {
if(nominaly[i][1]!=0) {
cout<<"Nominalu "<<nominaly[i][0]<<" uzyto "<<nominaly[i][1]<<" razy."<<endl;
}
}
} else cout<<"Nie da sie wyplacic reszty podanymi nominalami";
break;
case 2:
fstream dane;
dane.open("dane.txt", ios :: in);
//if(dane.good()==true) cout<<"ok";
for(int i=0; i<5; i++) {
dane>>miejsca[i];
//cout<<miejsca[i]<<" ";
dane>>egipt[i][0]>>egipt[i][1];
//cout<<egipt[i][0]<<" "<<egipt[i][1]<<endl;
}
dane.close();
cout<<"Podaj czas wycieczki (wielokrotnosc 0.5) z zakresu <0, 8>:"<<endl;
cin>>czas;
int ind=4;
double atrakcja=0;
switch(metoda) {
case 1:
cout<<"Plan wycieczki:\n";
while(ind>=0) {
if(czas-egipt[ind][0]>=0) {
cout<<miejsca[ind]<<", ";
atrakcja+=egipt[ind][1];
czas-=egipt[ind][0];
}
ind--;
}
cout<<endl<<"Atrakcyjnosc wycieczki: "<<atrakcja;
break;
case 2:
int rzut=(int)(czas*2); //wyznaczanie plecaków
double skok[rzut];
int roznica;
for(int i=1; i<=rzut; i++) {
skok[i-1]=0.5*i;
}
double tab[rzut][5];
for(int i=0; i<rzut; i++) { //wypełnienie pierwszego rzędu
if(egipt[0][0]<=skok[i]) tab[i][0]=egipt[0][1];
else tab[i][0]=0;
}
for(int i=1; i<=4; i++) {
for(int j=0; j<rzut; j++) {
cout<<egipt[i][0]<<endl;
if(egipt[i][0]==skok[j] && egipt[i][1]>tab[j][i-1]) {
tab[j][i]=egipt[i][1];
continue;
}
/*
roznica=(int)(egipt[i][0]*2);
cout<<roznica;
if(egipt[i][0]<skok[j] && (egipt[i][1]+tab[j-roznica][i-1])>tab[j][i-1]) {
tab[j][i]=egipt[i][1]+tab[j-roznica][i-1];
continue;
}*/
tab[j][i]=tab[j][i-1];
}
}
cout<<tab[rzut-1][4];
break;
}
break;
}
return 0;
}