Ponendo sia giusta la logica con la quale hai impostato il programma, c'è un richiamo errato delle funzioni logiche "AND, OR". Inoltre un consiglio: in un "if" con così tanti controlli, per non andare in errore, ti conviene utilizzare le parentesi distinguendo i vari controlli tra di loro.
Un codice improvvisato sul funzionamento dell' "AND, OR" e su una corretta scrittura di esse, o almeno secondo me (l'ho scritto in C e non in C++, tanto il ragionamento alla base rimane invariato):
#include <stdio.h>
int main(){
int valore = 0;
int peso = 0;
printf("Inserire peso -> \n");
scanf("%d", &peso);
printf("\nInserire valore -> \n");
scanf("%d", &valore);
if((valore == 30) && (peso > 30)){
//situazione verificata quando ENTRAMBE le condizioni sono rispettate
printf("\nAND");
}
else if((valore < 20) || (peso == 0)){
//situazione verificata quando ALMENO UNA delle condizioni è rispettata
printf("\nOR");
}
else if(((valore == 20) || (valore == 21)) && (peso <= 30)){
//controllo verificato quando valore assume O un valore di 20 O un valore di 21, E quando il peso è minore o uguale a 30
printf("\nOR e AND");
}
}
Prova a fare queste migliorie sul tuo programma forse l'errore si risolve.