Problém rozdelenia lupu

Created: 2008-06-19 - 16:47


public class Skuska_zlodejov {
     static double SucetRozptyluOdPriemeru = 20000;
     static int[] vitaznaKonstalacia;
     static double priemerNaZlodeja;
     static int[] poleNaUrychlenie;
     static double pomocna;
     public static void moznosti(int[] poletehiel, int[] pole, int index,
               int zlodeji) {
          if (poleNaUrychlenie ==null){
               poleNaUrychlenie = new int [zlodeji];
          }
          if (Skuska_zlodejov.priemerNaZlodeja == 0) {
               for (int i = 0; i < poletehiel.length; i++) {
                    priemerNaZlodeja += poletehiel[i];
               }
               priemerNaZlodeja /= zlodeji;
          }
          if (index != poletehiel.length) {
               for (int i = 0; i < zlodeji; i++) {
                    pole[index] = i;
                    for (int j = 0; j < zlodeji; j++) {  //Toto je na urychlenie niektore moznosti neriesi
                         poleNaUrychlenie[j]=0; // Pole v ktorom je ulozene kolko ktory zlodej ma na konte
                    }
                    for (int j = 0; j < index; j++) {  //Toto je na urychlenie niektore moznosti neriesi
                         poleNaUrychlenie[pole[j]]+=poletehiel[j]; // Pole v ktorom je ulozene kolko ktory zlodej ma na konte
                    }
                    pomocna = 0;
                    for (int j = 0; j < zlodeji ; j++) {
                         if (poleNaUrychlenie[j]>priemerNaZlodeja) //Sa skontroluje ci ma niektori zlodej viac ako priemer
                              pomocna+= poleNaUrychlenie[j]-priemerNaZlodeja; //Ak ano tak sa to pricita do pomocnej kde je sucet toho co ma ktory naviac od priemeru
                    }
                    if(pomocna>SucetRozptyluOdPriemeru) return; // ak sucet toho co maju zlodeju navyse od priemeru co maju mat je vetci tak dalej sa tato moznost nerozvyja
                    moznosti(poletehiel, pole, index + 1, zlodeji);
               }
          } else {
               for (int i = 0; i < pole.length; i++) {
                    System.out.print(pole[i]);
               }
               System.out.println();
               skontroluj(poletehiel, pole, zlodeji);
          }
     }

     public static void skontroluj(int[] poletehiel, int[] pole, int zlodeji) {
          double pomocna = 0;
          double result = 0;
          
          int[] tehlyzlodejov = new int[zlodeji];
          for (int i = 0; i < pole.length; i++) {
               tehlyzlodejov[pole[i]] += poletehiel[i];
          }
          for (int i = 0; i < tehlyzlodejov.length; i++) {
               pomocna = tehlyzlodejov[i] - priemerNaZlodeja;
               if (pomocna < 0)
                    pomocna *= -1;
               result += pomocna;
          }
          if (Skuska_zlodejov.SucetRozptyluOdPriemeru > result) {
               Skuska_zlodejov.SucetRozptyluOdPriemeru = result;
               vitaznaKonstalacia = pole.clone();
               
          }
     }

     public static void naplnpole(int[] pole) {
          for (int i = 0; i < pole.length; i++) {
               pole[i] = (int) (Math.random() * 100);
          }
     }

     /**
      * @param args
      */
     public static void main(String[] args) {
          int[] poletehiel = new int[10]; // Pocet tehiel
          int[] polemoznosti = new int[10]; // pole moznosti na pracu

          naplnpole(poletehiel);
          moznosti(poletehiel, polemoznosti, 0, 5); // pocet zlodejov je na konci
          System.out.println(Skuska_zlodejov.SucetRozptyluOdPriemeru + " Sucet odchylky od priemeru ");
          System.out.println(priemerNaZlodeja + " Priemer na zlodeja");
          for (int i = 0; i < vitaznaKonstalacia.length; i++) {
               System.out.print(vitaznaKonstalacia[i] + " ");
          }
          System.out.println("Ktora tehla komu patri");
          for (int i = 0; i < poletehiel.length; i++) {
               System.out.print(poletehiel[i] + " ");
          }
          System.out.print(" Vahy tehal");
     }

}