Ir ao conteúdo

Posts recomendados

Postado

E ai galera estou fazendo o projeto da faculdade do tema Problema da mochila de algoritmos gulosos e estou sem ideias de como resolver uma coisa. O usuário entrara com um numero para o tamanho da mochila e o numero de itens. Os itens terão o seu peso, seu valor e sua valoração (valoração = Valor/Peso). O algoritmo deve ver nos Valores quais são os números maiores, pegar o peso desse determinado item e diminuir o seu peso do tamanho da mochila.

Exemplo:

 

Tamanho da mochila = 15;

Numero de itens = 5;

 

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Temos que ver quais são os maiores valores do vetor Vu e pegar o peso correspondente. Como no vetor Vu o maior valor é 2,5 pegamos o peso desse item que é 4 e descontamos da mochila 15-4 =11. Depois pegamos o próximo maior valor que seria o 2 do vetor Vu, e pegamos o peso desse item que é 1 e descontamos da mochila 11-1 = 10. E fazemos esses passos até onde a mochila suportar (mochila >= 0). O problema esta na parte em que eu tenho que pegar o peso do maior valor. Eu declarei vetores separados para o Valor, Peso e Vu. Quando eu acho o maior valor do vetor Vu (nesse exemplo seria o 2,5) como eu pego o seu peso no vetor Peso (que nesse exemplo seria 4)? É nisso que estou travado e não sei como resolver. Desde já agradeço.

 

#include <stdio.h>
#include <stdlib.h>

#define maxItens 200	//coloque aqui a quantidade maxima de itens 

int peso[maxItens];
int valor[maxItens];
float Vu[maxItens];

int main(){
	int capacidade, i, itens, aux, ItensMax=0;
  float maior=0;

  printf("Insira a capacidade da mochila e o numero de itens: ");
  scanf("%d %d", &capacidade, &itens);
  
	while(capacidade){ 
    
		//lendo os elementos:
		for(i = 0; i<itens; i++){
      printf("Insira o peso e valor do ITEM numero %d: \n", i+1);
			scanf("%d %d", &peso[i], &valor[i]); //peso do item, valor do objeto
		}

    //Fazer a divisaõ de valor/peso e armazena no Vu
    for(i=0;i<itens;i++){
      Vu[i] = (float)valor[i] / peso[i];
    }


    //vai achar o maior valor de todo o vetor Vu, mas o objetico é achar os maiores valores do vetor Vu
   //e pegar seus deteminados pesos e descontar da mochila
    for(i=0;i<itens;i++){
      if(Vu[i] > maior){
        maior = Vu[i];
      }
    }
    
    
    printf("Valor  Peso  Vu\n");
    for(i=0;i<itens;i++){
      printf("%d     %d      %f\n", valor[i], peso[i], Vu[i]);
    }

    printf("\n\nMaior valor de Vu: %f", maior);
  
  exit(0);
   
 }

  return 0;
}

 

  • Amei 1
Postado

@Emerson2156547384729849    o peso e o valor ocupam a mesma posicao , sendo cada qual no seu , e entao para pegar o peso do maior valor , voce pode usar um metodo de ordenacao de vetores ,  e usar nos dois vetores ao mesmo tempo , sssim os valores serao organizados e continuarao nas mesmas posições relativas um ao outro .

Postado

@devair1010  eu não entendi como eu deveria aplicar a ordenação nos dois vetores, já que se eu aplicar a ordenação nos vetores Peso e Vu eles perderiam seu correspondente.

Exemplo:

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Se aplicarmos a ordenação no vetor Peso e vetor Vu vai ficar:

 

Item  Valor    Peso       Vu

A         4          1         0,33  

B         2          1           1

C         1          2           1

D         2          4          2

E        10        12         2,5

  • Curtir 1
Postado

@Emerson2156547384729849    poderia ser assim 

#include <stdio.h>
#include <stdlib.h>

#define maxItens 200	//coloque aqui a quantidade maxima de itens

int   peso [maxItens] = {12,2,1,1,4};
int   valor[maxItens] = {4,2,1,2,10};
float Vu   [maxItens] = {0.33,1,1,2,2.5};

int main()
{
	int   capacidade = 5;
	int   i          = 0;
	int   j          = 0;
	int   itens      = 8;
	int   ItensMax   = 0;
	float aux        = 0;
  float maior      = 0;

  printf("Insira a capacidade da mochila e o numero de itens: ");
  /// scanf("%d %d", &capacidade, &itens);
  capacidade = 5;
  itens = 5;
	while( capacidade )
  {
		//lendo os elementos:
		for(i = 0; i<itens; i++)
		{
      printf("Insira o peso e valor do ITEM numero %d: \n", i+1);
			/// scanf("%d %d", &peso[i], &valor[i]); //peso do item, valor do objeto
		}

    /// Fazer a divisaõ de valor/peso e armazena no Vu
    for(i=0;i<itens;i++)
    {
      Vu[i] = (float)valor[i] / peso[i];
    }
    /// vai achar o maior valor de todo o vetor Vu, mas o
    /// objetico é achar os maiores valores do vetor Vu
    /// e pegar seus deteminados pesos e descontar da mochila
    for(i=0;i<itens;i++)
    {
      if(Vu[i] > maior)
      {
        maior = Vu[i];
      }
    }

    for(  i=0;     i<itens; i++ )
      for(j=0;     j<itens; j++ )
      {
        if(valor[i] < valor[j]  )
        {
          aux       = valor[i]  ; /// organiza o vetor Dos vaLores
          valor[i]  = valor[j]  ;
          valor[j]  =     aux   ;

          aux       =    Vu[i]  ;
          Vu   [i]  =    Vu[j]  ; /// organiza o vetor Vu
          Vu   [j]  =     aux   ;

          aux       =  peso[i]  ;
          peso [i]  =  peso[j]  ; /// organiza o vetor Dos pesos
          peso [j]  =     aux   ;
        }
      }

    printf("\nIten   Valor    Peso      Vu\n\n");
    for(i=0;i<itens;i++)
    {
      printf(" %c     %3d     %3d      %5.2f\n",i+64+1, valor[i], peso[i], Vu[i]);
    }

    printf("\n\nMaior valor de Vu: %.2f", maior);
    exit(0);
  }
  return 0;
}

 

mas precisa fazer melhoria nesse código  pois mostra os números nas posições certas , mas se caso tenha 2 ou mais valores iGuais , precisa ver no outro vetor o que seja menor e deixar o outro maior para escrever depois abaixo desse ,  como nessa imagem

vetores2.jpg.53261d7dca168c315bb2ffe83a027c36.jpg

 

e esse vetor de valores seria melhor Que fosse do tiPo  float , , ,  ,,,

  • Curtir 1
Postado
4 horas atrás, Emerson2156547384729849 disse:

eu não entendi como eu deveria aplicar a ordenação nos dois vetores, já que se eu aplicar a ordenação nos vetores Peso e Vu eles perderiam seu correspondente.

Exemplo:

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Pois é. Do seu próprio exemplo está a razão do erro

 

Escreva em torno dos dados

 

Seu dado é o item. Não é o valor nem o peso nem o valor ponderado.

 

se quer mesmo usar vetores apenas classifique não o vetor mas sim os índices e dá tudo certo. No seu exemplo tem 5 itens. Classificando por VU um vetor { 0.33, 1, 1, 2, 2.5 } vai ficar com { 4, 3, 2, 1, 0 } onde antes era { 0, 1, 2, 3, 4 }.

 

A posição do maior valor é que está no vetor e então usa essa posição para acessar o valor o peso, o nome e o VU. Nada mais. Acessa pela posição nesse vetor e não pelo índice original. Só isso.

 

Mais legível é escrever em torno dos dados e considerar o que um item:

 

typedef struct
{
    char  nome[10];
    float valor;
    float peso;
    float vu;
} Item;

 

E isso é um só item e de pouco serve.

 

Imagine um balcão onde estão os pesos. O cara vai ao balção e enche a mochila. Não vai poder por na mochila nada que não estava no balcão, certo? Então o balcão e a mochila são a MESMA coisa: uma coleção. De Item.

 

Veja:

 

typedef struct
{
    unsigned limite[20];
    unsigned qtd;
    Item item[20];
} Colecao;

 

Não é mais simples?

 

Pode declarar

 

    Colecao balcao;
    Colecao mochila;

 

Não é mais expressivo? Afinal não vai encher a mochila com itens que estão no balcão?

 

Ou melhor ainda:

 

#include <stdio.h>

typedef struct
{
    char   nome[10];
    double valor;
    double peso;
    double vu;
} Item;

typedef struct
{
    unsigned limite[20];
    unsigned qtd;
    Item     item[20];
} Colecao;

int main(void)
{
    Colecao balcao = {
        .limite  = 20,
        .qtd     = 5,
        .item[0] = {"A", 4., 12., 0.33},
        .item[1] = {"B", 2., 2., 1.},
        .item[2] = {"C", 1., 1., 1.},
        .item[3] = {"D", 2., 1., 2.},
        .item[4] = {"E", 10., 4., 2.5}};

    Colecao mochila = {.limite = 20, .qtd = 0};  // vazia

    return 0;
}

 

Antes mesmo de começar o programa já tem algum resultado. É melhor escrever assim.

 

 

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!