Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void ordena_decrescente(int *vetor, int tamanho);
  6. void insertion_sort(int *vetor, int tamanho);
  7. void merge_sort(int *vetor, int tamanho);
  8. void merge(int *vetor, int *esquerda, int contEsquerda, int *direita, int contDireita);
  9. void metodo_guloso(int *vetor,int tamanho);
  10. void mostrar_vetor(int *vetor,int tamanho);
  11. int programacao_dinamica(int *vetor,int tamanho);
  12.  
  13. int main(int argc, char *argv [ ] ){
  14.     /* Criando variaveis do sistema*/
  15.     int tamanho,respDinamica;
  16.     FILE *arq;
  17.  
  18.     /* Abrindo arquivo para leitura*/
  19.     arq = fopen(argv[1],"r");
  20.  
  21.     /* Verificando se o arquivo existe, se não existir é emitida uma mensagem de erro caso contrário lemos o arquivo*/
  22.     if(arq == NULL){
  23.         printf("Erro, nao foi possivel abrir o arquivo\n");
  24.     }
  25.     else{
  26.         /* Instanciando a variavei tamanho com as informações do arquivo */
  27.         fscanf(arq,"%d",&tamanho);
  28.         int i,vetor[tamanho];
  29.         /*Criando e preenchendo o vetor com os valores do arquivo */
  30.         for(i=0; i< tamanho; i++){
  31.             fscanf(arq,"%d",&vetor[i]);
  32.         }
  33.  
  34.         fclose(arq);
  35.         /*Ordena o vetor em ordem decrescente de valores inteiros*/
  36.  
  37.  
  38.         /*Método guloso*/
  39.         printf("Solucao do problema pelo algoritmo guloso:\n\n");
  40.         ordena_decrescente(vetor,tamanho);
  41.         metodo_guloso(vetor,tamanho);
  42.         printf("\n\n-----------------------------------------\n\n");
  43.         /*Método de programação dinâmica*/
  44.         printf("Solucao do problema pelo algoritmo com programacao dinamina:\n\n");
  45.         respDinamica = programacao_dinamica(vetor,tamanho);
  46.         if(respDinamica==0){
  47.             printf("Achou!!");
  48.         }else{
  49.             printf("Nao achou!!");
  50.         }
  51.     }
  52.     return 0;
  53. }
  54.  
  55. void metodo_guloso(int *vetor,int tamanho){
  56.     int somaA, somaB,i,j,k;
  57.     somaA=somaB=j=k=0;
  58.  
  59.     /*Caso o tamanho do vetor original tenha tamanho 2 basta criar um vetor com a posicao 0 do vetor original e outro com a posicao 1
  60.     e a soma de cada vetor novo é o valor do elemento contido nele*/
  61.     if(tamanho == 2){
  62.         int vetorA,vetorB;
  63.         vetorA=somaA=vetor[0];
  64.         vetorB=somaB=vetor[1];
  65.         printf("Vetor original tem tamanho 2\n");
  66.         printf("Soma do vetor A = %d \nVetorA = %d\n",vetorA,vetorA);
  67.         printf("Soma do vetor B = %d \nVetorB = %d\n",vetorB,vetorB);
  68.     }else if(tamanho>2){
  69.         /*Cria-se os vetores A e B que terão a  resposta final*/
  70.         int vetorA[tamanho],vetorB[tamanho];
  71.         /*Varrer o vetor original ordenado em ordem decrescente*/
  72.         for(i=0;i<tamanho;i++){
  73.             /*Caso a soma do vetor A novo seja menor ou igual que a do vetor B o elemento do vetor
  74.              original correspondente ao indice i será adicionado a ele e somado em sua soma, esse elemento
  75.               será adicionado a B e somado a sua soma caso a soma de B seja menor q a de A*/
  76.             if(somaA<=somaB){
  77.                 vetorA[j]=vetor[i];
  78.                 somaA = somaA + vetor[i];
  79.                 j++;
  80.             }else{
  81.                 vetorB[k]=vetor[i];
  82.                 somaB = somaB + vetor[i];
  83.                 k++;
  84.             }
  85.         }
  86.         printf("Soma do vetor A = %d\nVetorA = ",somaA);
  87.         mostrar_vetor(vetorA,j);
  88.         printf("\nSoma do vetor B = %d\nVetorB = ",somaB);
  89.         mostrar_vetor(vetorB,k);
  90.     }
  91. }
  92.  
  93. int programacao_dinamica(int *vetor,int tamanho){
  94.     int i,j, somaTotal,metade;
  95.     somaTotal = 0;
  96.  
  97.     for(i=0;i<tamanho;i++){
  98.         somaTotal += vetor[i];
  99.     }
  100.  
  101.     if(somaTotal%2 !=0){
  102.         return 1;
  103.     }
  104.  
  105.     metade = somaTotal/2;
  106.  
  107.     int matriz[metade+1][tamanho+1];
  108.     // 0 é true e 1 é false
  109.     for(i=0;i<=tamanho;i++){
  110.         matriz[0][i] = 0;
  111.     }
  112.     for(i=1;i<=metade;i++){
  113.         matriz[i][0] = 1;
  114.     }
  115.  
  116.     for(i=1;i<=metade;i++){
  117.         for(j=1;j<=tamanho;j++){
  118.             matriz[i][j] = matriz[i][j-1];
  119.             if(i>=vetor[j-1]){
  120.                 if(matriz[i][j-1] == 0 || matriz[i-vetor[j-1]][j-1] == 0){
  121.                     matriz[i][j] = 0;
  122.                     //printf("Entrou aqui\n");
  123.                 }
  124.  
  125.                 //matriz[i][j] ==matriz[i][j] || matriz[i-vetor[j-1]][j-1];
  126.             }
  127.         }
  128.  
  129.     }
  130.     /*1
  131.     printf("\n");
  132.     for(i=0;i<metade;i++){
  133.         for(j=0;j<tamanho;j++){
  134.             printf("%d",matriz[i][j]);
  135.         }
  136.         printf("\n");
  137.     }
  138.     */
  139.  
  140.     return matriz[metade][tamanho];
  141. }
  142.  
  143.  
  144. void mostrar_vetor(int *vetor,int tamanho){
  145.     int i;
  146.     printf("[");
  147.     for(i=0;i<tamanho;i++){
  148.         if(i==tamanho-1){
  149.             printf("%d]\n",vetor[i]);
  150.         }else{
  151.             printf("%d,",vetor[i]);
  152.         }
  153.     }
  154. }
  155.  
  156. void ordena_decrescente(int *vetor, int tamanho){
  157.     int i,j,aux;
  158.     /*Para o caso da entrada ter um numero de valores inteiro menores que cinco mil o algoritmo ordena pelo insertion sort,
  159.     caso contrario o algoritmo ordena o vetor pelo merge sort*/
  160.     if(tamanho<5000){
  161.         insertion_sort(vetor,tamanho);
  162.     }else{
  163.         merge_sort(vetor,tamanho);
  164.     }
  165.     /*Após a ordenação o algoritmo coloca o vetor ordenado em ordem decrescente usando um passo O(n)*/
  166.     j=tamanho-1;
  167.     for(i=0;i<tamanho/2;i++){
  168.         aux = vetor[i];
  169.         vetor[i]=vetor[j];
  170.         vetor[j]=aux;
  171.         j--;
  172.     }
  173. }
  174. void insertion_sort(int *vetor, int tamanho){
  175.     int i, j, menor_atual;
  176.  
  177.     for(i = 1; i<tamanho; i++){
  178.         menor_atual = vetor[i];
  179.         for(j = i-1; (j>=0)&&(menor_atual < vetor[j]); j--){
  180.             vetor[j+1] = vetor[j];
  181.         }
  182.         vetor[j+1] = menor_atual;
  183.     }
  184. }
  185.  
  186. void merge(int *vetor, int *esquerda, int contEsquerda, int *direita, int contDireita){
  187.     int i, j, k;
  188.     i= j= k= 0;
  189.  
  190.     while(i<contEsquerda && j< contDireita){
  191.         if(esquerda[i] < direita[j]){
  192.             vetor[k++] = esquerda[i++];
  193.         }else{
  194.             vetor[k++] = direita[j++];
  195.         }
  196.     }
  197.  
  198.     while(i<contEsquerda){
  199.         vetor[k++] = esquerda[i++];
  200.     }
  201.  
  202.     while(j<contDireita){
  203.         vetor[k++] = direita[j++];
  204.     }
  205. }
  206.  
  207. void merge_sort(int *vetor, int tamanho){
  208.     int *esquerda, *direita, i, meio;
  209.     if(tamanho <2){
  210.         return;
  211.     }
  212.  
  213.     meio =  tamanho/2;
  214.  
  215.     esquerda = (int *) malloc(sizeof(int) * (meio));
  216.     direita = (int *) malloc(sizeof(int) * (tamanho - meio));
  217.  
  218.     for(i = 0; i< meio; i++){
  219.         esquerda[i] =
  220.         vetor[i];
  221.     }
  222.  
  223.     for(i=meio; i<tamanho; i++){
  224.         direita[i - meio] = vetor[i];
  225.     }
  226.  
  227.     merge_sort(esquerda,meio);
  228.     merge_sort(direita, (tamanho-meio));
  229.     merge(vetor, esquerda, meio, direita, (tamanho-meio));
  230.  
  231.     free(esquerda);
  232.     free(direita);
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement