我有两个数组
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
索引位置......但我需要解决第一个问题。如果您有建议,请告诉我。
谢谢。