Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.75 KB | None | 0 0
  1. import java.math.BigDecimal;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4.  
  5. import static java.lang.Math.*;
  6.  
  7. public class Knapsack_Problem
  8. {
  9.     private static BigDecimal zero = new BigDecimal("0");
  10.     private static BigDecimal half = new BigDecimal("0.5");
  11.  
  12.     public static void main(String[] args) {
  13.         int[] a = {12, 11, 10, 9, 33, 44, 55, 66};
  14.         int S = 100;
  15.         ArrayList<BigDecimal[]> C = new ArrayList<>();
  16.         ArrayList<BigDecimal[]> b = new ArrayList<>();
  17.         BigDecimal[] c = new BigDecimal[a.length + 1];
  18.         BigDecimal[] x = new BigDecimal[a.length];
  19.         Arrays.fill(c, zero);
  20.  
  21.         //step 1
  22.         double m = ceil(sqrt(a.length) * 0.5);
  23.  
  24.         //step 2
  25.         for (int i = 0; i < a.length; i++) {
  26.             c[i] = new BigDecimal(1);
  27.             c[a.length] = new BigDecimal(m * a[i]);
  28.             C.add(c.clone());
  29.             Arrays.fill(c, zero);
  30.         }
  31.         Arrays.fill(c, half);
  32.         c[a.length] = new BigDecimal(S * m);
  33.         C.add(c.clone());
  34.         for (BigDecimal[] aB : C) {
  35.             for (BigDecimal anAB : aB) System.out.print(anAB + " ");
  36.             System.out.println();
  37.         }
  38.  
  39.         LLL lll = new LLL(C);
  40.         b = lll.getResult();
  41.  
  42.         //step 3
  43.         Boolean flag = true;
  44.  
  45.         for (int i = 0; i < b.size(); i++) {
  46.             for (int j = 0; j < b.get(i).length - 2; j++)
  47.                 if (!b.get(i)[j].equals(0.5) && !b.get(i)[j].equals(-0.5))
  48.                     flag = false;
  49.             if (b.get(i)[b.get(i).length - 1].equals(0) && flag) {
  50.                 for (int j = 0; j < b.get(i).length - 2; j++) {
  51.                     x[j] = b.get(i)[j];
  52.                     x[j].add(half);
  53.                 }
  54.                 BigDecimal sum = BigDecimal.ZERO;
  55.                 for (int j = 0; j < b.get(i).length - 2; j++)
  56.                     sum.add(x[j].multiply(new BigDecimal(a[j])));
  57.                 if (sum.equals(S))
  58.                     for (int k = 0; k < x.length; k++) {
  59.                         System.out.println(x[k] + " ");
  60.                         break;
  61.                     }
  62.  
  63.                 for (int j = 0; j < b.get(i).length - 2; j++) {
  64.                     x[j] = b.get(i)[j].negate();
  65.                     x[j].add(half);
  66.                 }
  67.                 BigDecimal sum1 = BigDecimal.ZERO;
  68.                 for (int j = 0; j < b.get(i).length - 2; j++)
  69.                     sum1.add(x[j].multiply(new BigDecimal(a[j])));
  70.                 if (sum1.equals(S))
  71.                     for (int k = 0; k < x.length; k++) {
  72.                         System.out.println(x[k] + " ");
  73.                         break;
  74.                     }
  75.             }
  76.         }
  77.  
  78.         System.out.println("Решений нет");
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement