Festa di laurea (laurea) 20 / 100


#1

Ottengo 20/100, non riesco a capire dove sbaglio.
Se qualcuno mi potesse dare una mano ve ne sarei molto grato.
Grazie in anticipo.

#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int confronto (int N,int Nmezzi[4],int Prezzo[4],int capacita[4],int posti,int costo,int pos)
{
	int min,temp;
	min=100001;
	Nmezzi[pos]--;
	if (posti>=N)
	{

		return costo;
	}
	else
	{
		for (int i=0;i<4;i++)
		{
			if (Nmezzi[i]>0)
			{

				temp=confronto(N,Nmezzi,Prezzo,capacita,posti+capacita[i],costo+Prezzo[i],i);
				if (temp<min)
					min=temp;
			}
		}
		return min;
	}
}
int main()
{
	ifstream leggi("input.txt");
	ofstream scrivi("output.txt");
	int N,D,P,i;
	int Nmezzi[4];
	int Prezzo[4];
	int capacita[4]={2,4,5,7};
	leggi>>N;
	for (i=0;i<4;i++)
	{
		leggi>>D>>P;
		Nmezzi[i]=D;
		Prezzo[i]=P;	
	}
	scrivi<<confronto(N,Nmezzi,Prezzo,capacita,0,0,0);
}

#2

Ciao, il problema principale è che quando passi alla funzione una variabile non viene creata una copia fisica della stessa ma un puntatore a quella variabile, in altre parole quando fai l’operazione:

viene modificato sempre lo stesso vettore.
Devi quindi semplicemente aggiungere un Nmezzi[pos]++ prima dei due return costo.
(Se vuoi un consiglio cerca di dichiarare le variabili globali, non solo il codice diventa più pulito ma risparmi anche tempo e memoria quando richiami funzoni fuori dal main ed eviti errori dovuti all’inizializzazione)
Però manca ancora qualcosa: quando richiami la funzione la prima volta pos è uguale a 0, ma non è detto che tu debba noleggiare sempre lo scooter.
Spero di aver risolto.


#3

Mi permetto di dire che però estrapolato dal contesto quello che hai detto non è corretto: viene creata una copia, ma del puntatore (al primo elemento dell’array). Questi due puntatori puntano però allo stesso indirizzo di memoria e “condividono” quindi i loro dati, in ogni modo il nuovo puntatore/array è a tutti gli effetti un puntatore diverso e può quindi essere riassegnato senza invalidare il puntatore da cui è stato copiato :slight_smile:


#4

Beh sì, magari non ho specificato troppo :sweat_smile:
Comunque il succo era che non viene creato dal nulla un altro vettore.


#5

Grazie mille.
Si questa era un’informazione che completamente ignoravo, infatti ora sto incominciando a capire perchè tanti codici che creavo non funzionavano…


#6

Di nulla :+1: felice di esserti stato utile anche su altri problemi.