Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.35 KB | None | 0 0
  1. package algoritmit2;
  2.  
  3. import java.util.Random;
  4.  
  5. /**
  6.  * Algoritmit 2 -kurssin neljännen ohjelmointitehtävän ratkaisu, joka ratkaisee kapsäkkiongelman taulukoimalla.
  7.  * @author Saku
  8.  * @version 28.4.2017
  9.  *
  10.  */
  11. public class Kapsakki {
  12.     Tavara[] tavarat;
  13.     int lkm = 10; // Perusjoukossa olevien tavaroiden lukumäärä.
  14.     int kokonaispaino = 20;
  15.    
  16.     /**
  17.      * Ohjelmaa testaava pääluokka.
  18.      * @param args Ei käytössä.
  19.      */
  20.     public static void main(String[] args){
  21.         Kapsakki k = new Kapsakki();
  22.         k.alustaTavarat();
  23.        
  24.        
  25.         int vastaus = k.s( k.tavarat.length -1 , k.kokonaispaino);
  26.         k.tulostaTavarat();
  27.         System.out.println("Kapsäkkiin(, jonka kokonaispainoraja on " + k.kokonaispaino + ") mahtuvista tavaroista kertyvä suurin hyötyarvo: " + vastaus);
  28.        
  29.         System.out.println("");
  30.        
  31.         k.kokonaispaino = 100; // Nyt laukkuun mahtuvat kaikki tavarat, joten hyötyarvo on sama, kuin tavaroiden yhteishyötyarvo.
  32.         vastaus = k.s( k.tavarat.length -1 , k.kokonaispaino);
  33.         k.tulostaTavarat();
  34.         System.out.println("Kapsäkkiin(, jonka kokonaispainoraja on " + k.kokonaispaino + ") mahtuvista tavaroista kertyvä suurin hyötyarvo: " + vastaus);
  35.        
  36.     }
  37.    
  38.    
  39.     /**
  40.      * Tulostaa perusjoukossa olevien tavaroiden painot ja hyötyarvot.
  41.      */
  42.     private void tulostaTavarat(){
  43.         System.out.println("Perusjoukosta löytyvät tavarat: ");
  44.         int painoYht = 0;
  45.         int hyotyYht = 0;
  46.         for(int i = 0; i < tavarat.length; i++){
  47.             System.out.println("Tavaran " + (i + 1)+ " paino on: " + tavarat[i].paino + " ja hyötyarvo: " + tavarat[i].hyoty );
  48.             painoYht += tavarat[i].paino;
  49.             hyotyYht += tavarat[i].hyoty;
  50.         }
  51.         System.out.println("Tavaroiden yhteispaino on: " + painoYht);
  52.         System.out.println("Tavaroiden yhteishyötyarvo on: " + hyotyYht);
  53.     }
  54.        
  55.    
  56.     /**
  57.      * Metodi, joka laskee kapsäkkiin mahtuvien tavaroiden maksimaalisen hyötyarvon.
  58.      * @param k joukon koko, josta tavaroita tutkitaan.
  59.      * @param r Kapsäkin kokonaispainoraja.
  60.      * @return Suurin laukkuun mahtuva hyötyarvo.
  61.      */
  62.     private int s(int k, int r) {
  63.         if(k < 0 || r <= 0){
  64.             return 0;
  65.         }
  66.        
  67.         if(tavarat[k].paino > r){
  68.            return s(k-1, r);
  69.         }
  70.         return Math.max(s(k-1, r), tavarat[k].hyoty + s(k-1, r - tavarat[k].paino));
  71.        
  72.        
  73.        
  74.     }
  75.  
  76.  
  77.     /**
  78.      * Alustaa perusjoukon tavarat satunnaisilla arvoilla.
  79.      */
  80.     private void alustaTavarat() {
  81.         tavarat = new Tavara[lkm];
  82.         Random r = new Random();      
  83.         for(int i = 0; i < lkm; i++){
  84.            tavarat[i] = new Tavara((r.nextInt(10)+1), (r.nextInt(10)+1) );
  85.        }
  86.     }
  87.  
  88.  
  89.  
  90.     /**
  91.      * Tavara luokka, jonka esiintymillä kapsäkki täytetään.
  92.      *
  93.      */
  94.     public static class Tavara {
  95.             int paino = 0;
  96.             int hyoty = 0;
  97.            
  98.             /**
  99.              * Tavaran muodostaja -metodi.
  100.              * @param w tavaran paino
  101.              * @param p tavaran hyötyarvo
  102.              */
  103.             public Tavara(int w, int p ){
  104.                 this.paino = w;
  105.                 this.hyoty = p;
  106.             }
  107.         }
  108.        
  109.    
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement