[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
