void embaralha_vetor(int *vetor, int n)
{
  int aux, j1, j2;

  for (int i=0; i < n; i++)
  {
    j1 = random(n);
    j2 = random(n);
    while (j1 == j2) j2 = random(n);
    aux = vetor[j1];
    vetor[j1] = vetor[j2];
    vetor[j2] = aux;
  }
}


void descida(int n, int *s, int *p, int *w, int b, int penalidade, int *peso_objetos, int *fo, double percentual)
{
    int delta, melhor_delta, melhor_posicao;
    int n_vizinhos = MAX(0, (int) (percentual*n));
    int *vet, aux, j1, j2;

    melhor_delta = INT_MAX;
    vet = cria_vetor(n);

    for (int j=0; j < n; j++) vet[j] = j;

    while(melhor_delta > 0) //while 1
    {
        melhor_delta = -INT_MAX;
        embaralha_vetor(vet, n);

        for (int j=0; j < n_vizinhos; j++) //for 1
        {
            troca_bit(s, vet[j]);
            delta = (-p[vet[j]]*!s[vet[j]] + p[vet[j]]*s[vet[j]] + penalidade*MAX(0, *peso_objetos - b) - penalidade*MAX(0, *peso_objetos - w[vet[j]]*!s[vet[j]] + w[vet[j]]*s[vet[j]] - b));
            if (delta > melhor_delta) //if 1
            {
                melhor_delta = delta;
                melhor_posicao = vet[j];
            }//if 1
            troca_bit(s, vet[j]);
        }//for 1
        if (melhor_delta > 0) //if 2
        {
            *fo = *fo + melhor_delta;
            troca_bit(s, melhor_posicao); // s <-- s
            *peso_objetos += -w[melhor_posicao] * !s[melhor_posicao] + w[melhor_posicao] * s[melhor_posicao];
        }//if 2

    }//while 1

    printf("-------------------------------------------------\n");
    printf("Melhor solucao encontrada pelo Metodo da descida:\n");
    printf("Funcao objetivo: %d\n", *fo);
    printf("Peso da mochila: %d    Inviabilidade = %d \n", *peso_objetos, MAX(0,*peso_objetos - b));
    printf("-------------------------------------------------\n");
    libera_vetor(vet);
}//descida