[C] Semplice algoritmo di backtracking
La consegna dell'esercizio è questa:
E’ dato un vettore v[N] contenete N (fissato) elementi della seguente struttura dati:
Dove ogni articolo, identificato dal nome, compare una sola volta. Scrivere un programma che visualizzi tutti i possibili insiemi di 4 articoli il cui costo totale sia esattamente 30 Euro.
Io ho fatto questo programmino che segue la struttura dell'algoritmo di backtracking:
Guardando su schermo gli articoli visualizzati ho l'impressione di aver sbagliato qualcosina. Qualcuno riesce a darmi una mano?
E’ dato un vettore v[N] contenete N (fissato) elementi della seguente struttura dati:
typedef struct{
char nome[10];
int prezzo;
} Articolo;
Dove ogni articolo, identificato dal nome, compare una sola volta. Scrivere un programma che visualizzi tutti i possibili insiemi di 4 articoli il cui costo totale sia esattamente 30 Euro.
Io ho fatto questo programmino che segue la struttura dell'algoritmo di backtracking:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char nome[10];
int prezzo;
} Articolo;
void sceglioggetti(Articolo *articoli, int v[], int n, int s, int budget, int sommaparziale, int count){
if (s == n){
if (sommaparziale == budget){
printf("\nCarica: \n");
for (int i = 0; i < n; i++){
if (v[i] == 1){
printf("%s ", articoli[i].nome);
}
}
printf("\n");
}
return;
}
v[s] = 0;
sceglioggetti(articoli, v, n, s + 1, budget, sommaparziale, count);
if (articoli[s].prezzo += sommaparziale <= budget && count <= 4){
v[s] = 1;
sommaparziale += articoli[s].prezzo;
sceglioggetti(articoli, v, n, s + 1, budget, sommaparziale, count + 1);
}
}
int main(){
int n = 5;
int budget = 30;
int s = 0;
Articolo articoli[5] = { { "pop", 10 }, { "rock", 10 }, { "fama", 5 }, { "potere", 10 }, { "sport", 5 } };
int *v = calloc(n, sizeof(int));
int sommaparziale = 0;
int count = 0;
sceglioggetti(articoli, v, n, s, budget, sommaparziale, count);
}
Guardando su schermo gli articoli visualizzati ho l'impressione di aver sbagliato qualcosina. Qualcuno riesce a darmi una mano?
Risposte
Modificando la condizione del secondo if da
a
e dell'ultimo if da
a
il programma sembra funzionare.
Ho intuito quello che fa l'algoritmo, ma non avendolo ancora compreso appieno non saprei darti altri consigli.
if(sommaparziale == budget)
a
if(sommaparziale == budget && count == 4)
e dell'ultimo if da
if(articoli[s].prezzo += sommaparziale <= budget && count <= 4)
a
if(articoli[s].prezzo + sommaparziale <= budget && count <= 4)
il programma sembra funzionare.
Ho intuito quello che fa l'algoritmo, ma non avendolo ancora compreso appieno non saprei darti altri consigli.
grazie mille, ora ho capito che cosa sbagliavo