Java优化完全划分两个数组

时间:2018-04-13 22:57:00

标签: java recursion combinations

我有两个数组

List<Integer> num = Arrays.asList(31, 13, 2, 11);
List<Integer> den = Arrays.asList(17, 19, 7, 3);

我需要在大于1的所有可能对之间找到优化(最小和)除法。

示例等待结果:

Sum = 6.011 -> :(31/19)=1.632, (17/13)=1.308, (3/2)=1.5, (11/7)=1.571

注意:

(x/y) or (y/x) both are possible always that its result > 1, for optimization purpouse.

此问题需要所有完整组合。

这是我的代码:

private void optimalDivision(int size, int stage, List<Integer> num, 
    List<Integer> den, Double acum, List<List<CustomDivision>> listCustDiv, String incoming) {
  if (num.size() == 1) {
    Integer greater, smaller;
    Character indicator;
    if (num.get(0) >  den.get(0)) {
      greater = num.get(0);
      smaller = den.get(0);
      indicator = 'n';
    } else {
      smaller = num.get(0);
      greater = den.get(0);
      indicator = 'd';
    }
    Double operation = (double)greater/smaller;
    CustomDivision cd = new CustomDivision(indicator, num.get(0), den.get(0), 0, 0, operation);
    List<CustomDivision> oldOD = listCustDiv.get(listCustDiv.size() - 1);

    List<CustomDivision> newOD = new ArrayList<>(oldOD);
    oldOD.add(cd);
    //listCustDiv.add(newOD);
    listCustDiv.add(new ArrayList<>());
    double total = (acum + operation);
    System.out.println("Sum = " + fracVal(total, 3) + " -> :" + incoming 
        + "(" + greater + "/" + smaller + ")=" + fracVal(operation, 3));
  } else {
    for (int i = 0; i < den.size(); i++) {
      Integer greater, smaller;
      Character indicator;
      if (num.get(0) > den.get(i)) {
        greater = num.get(0);
        smaller = den.get(i);
        indicator = 'n';
      } else {
        smaller = num.get(0);
        greater = den.get(i);
        indicator = 'd';
      }
      Double operation = (double)greater/l;
      CustomDivision cd = new CustomDivision(indicator, num.get(0), den.get(i), 0, i, operation);
      (listCustDiv.get(listCustDiv.size() - 1)).add(cd);
      String outgoing = incoming + "(" + greater + "/" + smaller + ")=" + fracVal(operation, 3) + ", ";

      List<Integer> new_den = new ArrayList<>();
      for (int index_den = 0; index_den < den.size(); index_den++) {
        if (index_den != i) {
          new_den.add(den.get(index_den));
        }
      }
      List<Integer> new_num = new ArrayList<>();
      for (int index_num = 1; index_num < num.size(); index_num++) {
        new_num.add(num.get(index_num));
      }
      optimalDivision(size, stage + 1, new_num, new_den, acum + operation , listCustDiv, outgoing);
    }
  }
}

使用Pojo课......

  class CustomDivision {
    private Character indicator;
    private Integer num;
    private Integer den;
    private Integer idxNum;
    private Integer idxDen;
    private Double result;

    public CustomDivision(Character indicator, Integer num, Integer den, 
        Integer idxNum, Integer idxDen, Double result) {
      this.indicator = indicator;
      this.num = num;
      this.den = den;
      this.idxNum = idxNum;
      this.idxDen = idxDen;
      this.result = result;
    }
    public Character getIndicator() {
      return indicator;
    }
    public void setIndicator(Character indicator) {
      this.indicator = indicator;
    }
    public Integer getNum() {
      return num;
    }
    public void setNum(Integer num) {
      this.num = num;
    }
    public Integer getDen() {
      return den;
    }
    public void setDen(Integer den) {
      this.den = den;
    }
    public Integer getIdxNum() {
      return idxNum;
    }
    public void setIdxNum(Integer idxNum) {
      this.idxNum = idxNum;
    }
    public Integer getIdxDen() {
      return idxDen;
    }
    public void setIdxDen(Integer idxDen) {
      this.idxDen = idxDen;
    }
    public Double getResult() {
      return result;
    }
    public void setResult(Double result) {
      this.result = result;
    }
    @Override
    public String toString() {
    //if (indicator == 'n') {
    //  return "(" + num + "<" + idxNum + ">" + "/" + den + "<" + idxDen + ">" + ")=" + fracVal(result, 3);
    //}
    //if (indicator == 'd') {
    //  return "(" + den + "<" + idxDen + ">" + "/" + num + "<" + idxNum + ">" + ")=" + fracVal(result, 3);
    //}
      if (indicator == 'n') {
        return "(" + num + "/" + den + ")=" + fracVal(result, 3);
      }
      if (indicator == 'd') {
        return "(" + den + "/" + num + ")=" + fracVal(result, 3);
      }
      return "";
    }
  }

设置十进制数字的方法。

public static double fracVal(double value, int frac) {
  return Math.round(value * Math.pow(10.0, frac)) / Math.pow(10.0, frac);
}

如何测试代码:

List<Integer> num = Arrays.asList(31, 13, 2, 11);
List<Integer> den = Arrays.asList(17, 19, 7, 3);
List<List<CustomDivision>> div = new ArrayList<>();
div.add(new ArrayList<>());
optimalDivision(num.size(), 0, num, den, 0.0, div, "");
System.out.println();
for (List<CustomDivision> listOD: div) {
  Double r = 0.0;
  for (CustomDivision cd: listOD) {
    r += cd.getResult();
  }
  System.out.println("SUM = " + fracVal(r, 3) + ": " + listOD);
}

完整输出不带 ArrayList。

Sum = 10.452 -> :(31/17)=1.824, (19/13)=1.462, (7/2)=3.5, (11/3)=3.667
Sum = 6.356 -> :(31/17)=1.824, (19/13)=1.462, (3/2)=1.5, (11/7)=1.571
Sum = 16.847 -> :(31/17)=1.824, (13/7)=1.857, (19/2)=9.5, (11/3)=3.667
Sum = 6.908 -> :(31/17)=1.824, (13/7)=1.857, (3/2)=1.5, (19/11)=1.727
Sum = 17.228 -> :(31/17)=1.824, (13/3)=4.333, (19/2)=9.5, (11/7)=1.571
Sum = 11.384 -> :(31/17)=1.824, (13/3)=4.333, (7/2)=3.5, (19/11)=1.727
Sum = 10.106 -> :(31/19)=1.632, (17/13)=1.308, (7/2)=3.5, (11/3)=3.667
Sum = 6.011 -> :(31/19)=1.632, (17/13)=1.308, (3/2)=1.5, (11/7)=1.571
Sum = 15.655 -> :(31/19)=1.632, (13/7)=1.857, (17/2)=8.5, (11/3)=3.667
Sum = 6.534 -> :(31/19)=1.632, (13/7)=1.857, (3/2)=1.5, (17/11)=1.545
Sum = 16.036 -> :(31/19)=1.632, (13/3)=4.333, (17/2)=8.5, (11/7)=1.571
Sum = 11.01 -> :(31/19)=1.632, (13/3)=4.333, (7/2)=3.5, (17/11)=1.545
Sum = 18.903 -> :(31/7)=4.429, (17/13)=1.308, (19/2)=9.5, (11/3)=3.667
Sum = 8.964 -> :(31/7)=4.429, (17/13)=1.308, (3/2)=1.5, (19/11)=1.727
Sum = 18.057 -> :(31/7)=4.429, (19/13)=1.462, (17/2)=8.5, (11/3)=3.667
Sum = 8.936 -> :(31/7)=4.429, (19/13)=1.462, (3/2)=1.5, (17/11)=1.545
Sum = 18.989 -> :(31/7)=4.429, (13/3)=4.333, (17/2)=8.5, (19/11)=1.727
Sum = 19.807 -> :(31/7)=4.429, (13/3)=4.333, (19/2)=9.5, (17/11)=1.545
Sum = 22.712 -> :(31/3)=10.333, (17/13)=1.308, (19/2)=9.5, (11/7)=1.571
Sum = 16.868 -> :(31/3)=10.333, (17/13)=1.308, (7/2)=3.5, (19/11)=1.727
Sum = 21.866 -> :(31/3)=10.333, (19/13)=1.462, (17/2)=8.5, (11/7)=1.571
Sum = 16.84 -> :(31/3)=10.333, (19/13)=1.462, (7/2)=3.5, (17/11)=1.545
Sum = 22.418 -> :(31/3)=10.333, (13/7)=1.857, (17/2)=8.5, (19/11)=1.727
Sum = 23.236 -> :(31/3)=10.333, (13/7)=1.857, (19/2)=9.5, (17/11)=1.545

我的输出based on ArrayList,但错了!

SUM = 10.452: [(31/17)=1.824, (19/13)=1.462, (7/2)=3.5, (11/3)=3.667]
SUM = 3.071: [(3/2)=1.5, (11/7)=1.571]
SUM = 15.024: [(13/7)=1.857, (19/2)=9.5, (11/3)=3.667]
SUM = 3.227: [(3/2)=1.5, (19/11)=1.727]
SUM = 15.405: [(13/3)=4.333, (19/2)=9.5, (11/7)=1.571]
SUM = 5.227: [(7/2)=3.5, (19/11)=1.727]
SUM = 10.106: [(31/19)=1.632, (17/13)=1.308, (7/2)=3.5, (11/3)=3.667]
SUM = 3.071: [(3/2)=1.5, (11/7)=1.571]
SUM = 14.024: [(13/7)=1.857, (17/2)=8.5, (11/3)=3.667]
SUM = 3.045: [(3/2)=1.5, (17/11)=1.545]
SUM = 14.405: [(13/3)=4.333, (17/2)=8.5, (11/7)=1.571]
SUM = 5.045: [(7/2)=3.5, (17/11)=1.545]
SUM = 18.903: [(31/7)=4.429, (17/13)=1.308, (19/2)=9.5, (11/3)=3.667]
SUM = 3.227: [(3/2)=1.5, (19/11)=1.727]
SUM = 13.628: [(19/13)=1.462, (17/2)=8.5, (11/3)=3.667]
SUM = 3.045: [(3/2)=1.5, (17/11)=1.545]
SUM = 14.561: [(13/3)=4.333, (17/2)=8.5, (19/11)=1.727]
SUM = 11.045: [(19/2)=9.5, (17/11)=1.545]
SUM = 22.712: [(31/3)=10.333, (17/13)=1.308, (19/2)=9.5, (11/7)=1.571]
SUM = 5.227: [(7/2)=3.5, (19/11)=1.727]
SUM = 11.533: [(19/13)=1.462, (17/2)=8.5, (11/7)=1.571]
SUM = 5.045: [(7/2)=3.5, (17/11)=1.545]
SUM = 12.084: [(13/7)=1.857, (17/2)=8.5, (19/11)=1.727]
SUM = 11.045: [(19/2)=9.5, (17/11)=1.545]
SUM = 0.0: []

您需要的帮助。

至少使用ArrayList的 Sums 必须等于在行中使用 System.out.println 我没有解决的线索......

我的问题的第二部分是:   您可以看到triangle brackects我想从最初的ArrayList中放置original索引位置......但我需要解决第一个问题。如果您有建议,请告诉我。

谢谢。

0 个答案:

没有答案