[C] Semplice algoritmo di backtracking

jarrod
La consegna dell'esercizio è questa:
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
Super Squirrel
Modificando la condizione del secondo if da
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.

jarrod
grazie mille, ora ho capito che cosa sbagliavo :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.