2018-02-19 15:21:05 +01:00
|
|
|
// Copyright 2011 Hakan Kjellerstrand hakank@gmail.com
|
2011-03-20 06:23:53 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
2020-06-10 14:36:44 +02:00
|
|
|
package com.google.ortools.contrib;
|
|
|
|
|
|
2020-09-11 21:17:23 +02:00
|
|
|
import com.google.ortools.Loader;
|
2011-03-20 06:23:53 +00:00
|
|
|
import com.google.ortools.constraintsolver.DecisionBuilder;
|
|
|
|
|
import com.google.ortools.constraintsolver.IntVar;
|
|
|
|
|
import com.google.ortools.constraintsolver.Solver;
|
2018-10-31 16:18:18 +01:00
|
|
|
import java.io.*;
|
|
|
|
|
import java.text.*;
|
|
|
|
|
import java.util.*;
|
2011-03-20 06:23:53 +00:00
|
|
|
|
|
|
|
|
public class SendMoreMoney {
|
2018-10-31 16:18:18 +01:00
|
|
|
/** Solves the SEND+MORE=MONEY problem. */
|
2011-03-20 06:23:53 +00:00
|
|
|
private static void solve() {
|
|
|
|
|
int base = 10;
|
|
|
|
|
|
|
|
|
|
Solver solver = new Solver("SendMoreMoney");
|
2011-03-20 16:53:37 +00:00
|
|
|
IntVar s = solver.makeIntVar(0, base - 1, "s");
|
|
|
|
|
IntVar e = solver.makeIntVar(0, base - 1, "e");
|
|
|
|
|
IntVar n = solver.makeIntVar(0, base - 1, "n");
|
|
|
|
|
IntVar d = solver.makeIntVar(0, base - 1, "d");
|
|
|
|
|
IntVar m = solver.makeIntVar(0, base - 1, "m");
|
|
|
|
|
IntVar o = solver.makeIntVar(0, base - 1, "o");
|
|
|
|
|
IntVar r = solver.makeIntVar(0, base - 1, "r");
|
|
|
|
|
IntVar y = solver.makeIntVar(0, base - 1, "y");
|
2011-03-20 06:23:53 +00:00
|
|
|
|
2018-10-31 16:18:18 +01:00
|
|
|
IntVar[] x = {s, e, n, d, m, o, r, y};
|
2011-03-20 06:23:53 +00:00
|
|
|
|
2018-10-31 16:18:18 +01:00
|
|
|
IntVar[] eq = {s, e, n, d, m, o, r, e, m, o, n, e, y};
|
|
|
|
|
int[] coeffs = {
|
2020-09-23 12:10:52 +02:00
|
|
|
1000, 100, 10,
|
|
|
|
|
1, // S E N D +
|
|
|
|
|
1000, 100, 10,
|
|
|
|
|
1, // M O R E
|
|
|
|
|
-10000, -1000, -100, -10,
|
|
|
|
|
-1 // == M O N E Y
|
2011-03-20 06:23:53 +00:00
|
|
|
};
|
|
|
|
|
solver.addConstraint(solver.makeScalProdEquality(eq, coeffs, 0));
|
|
|
|
|
|
|
|
|
|
// alternative:
|
2020-09-23 12:10:52 +02:00
|
|
|
solver.addConstraint(solver.makeScalProdEquality(
|
|
|
|
|
new IntVar[] {s, e, n, d, m, o, r, e, m, o, n, e, y}, coeffs, 0));
|
2011-03-20 06:23:53 +00:00
|
|
|
|
|
|
|
|
// s > 0
|
|
|
|
|
solver.addConstraint(solver.makeGreater(s, 0));
|
|
|
|
|
// m > 0
|
|
|
|
|
solver.addConstraint(solver.makeGreater(m, 0));
|
|
|
|
|
|
2012-01-16 10:46:43 +00:00
|
|
|
solver.addConstraint(solver.makeAllDifferent(x));
|
2011-03-20 06:23:53 +00:00
|
|
|
|
2018-10-31 16:18:18 +01:00
|
|
|
DecisionBuilder db = solver.makePhase(x, solver.INT_VAR_DEFAULT, solver.INT_VALUE_DEFAULT);
|
2011-03-20 06:23:53 +00:00
|
|
|
solver.newSearch(db);
|
|
|
|
|
while (solver.nextSolution()) {
|
2018-10-31 16:18:18 +01:00
|
|
|
for (int i = 0; i < 8; i++) {
|
2011-03-20 16:53:37 +00:00
|
|
|
System.out.print(x[i].toString() + " ");
|
|
|
|
|
}
|
|
|
|
|
System.out.println();
|
2011-03-20 06:23:53 +00:00
|
|
|
}
|
|
|
|
|
solver.endSearch();
|
|
|
|
|
|
|
|
|
|
// Statistics
|
|
|
|
|
System.out.println();
|
|
|
|
|
System.out.println("Solutions: " + solver.solutions());
|
|
|
|
|
System.out.println("Failures: " + solver.failures());
|
|
|
|
|
System.out.println("Branches: " + solver.branches());
|
2012-01-21 17:15:03 +00:00
|
|
|
System.out.println("Wall time: " + solver.wallTime() + "ms");
|
2011-03-20 06:23:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) throws Exception {
|
2020-09-11 21:17:23 +02:00
|
|
|
Loader.loadNativeLibraries();
|
2011-03-20 06:23:53 +00:00
|
|
|
SendMoreMoney.solve();
|
|
|
|
|
}
|
|
|
|
|
}
|