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"); } }