import
java.util.Arrays;
import
java.util.Vector;
public
class
PackageAssignment {
static
int
[] memo =
new
int
[
1024
];
static
int
findDistance(Vector<Integer> worker, Vector<Integer> packageCoord) {
return
Math.abs(worker.get(
0
) - packageCoord.get(
0
))
+ Math.abs(worker.get(
1
) - packageCoord.get(
1
));
}
static
int
minimumDistanceSum(Vector<Vector<Integer>> drivers,
Vector<Vector<Integer>> packages,
int
driverIdx,
int
mask) {
if
(driverIdx >= drivers.size()) {
return
0
;
}
if
(memo[mask] != -
1
)
return
memo[mask];
int
smallestDistanceSum = Integer.MAX_VALUE;
for
(
int
packageIdx =
0
; packageIdx < packages.size(); packageIdx++) {
if
((mask & (
1
<< packageIdx)) ==
0
) {
smallestDistanceSum = Math.min(
smallestDistanceSum,
findDistance(drivers.get(driverIdx),
packages.get(packageIdx))
+ minimumDistanceSum(
drivers, packages, driverIdx +
1
,
mask | (
1
<< packageIdx)));
}
}
return
memo[mask] = smallestDistanceSum;
}
static
int
assignPackages(Vector<Vector<Integer>> drivers, Vector<Vector<Integer>> packages) {
Arrays.fill(memo, -
1
);
return
minimumDistanceSum(drivers, packages,
0
,
0
);
}
public
static
void
main(String[] args) {
Vector<Vector<Integer>> drivers =
new
Vector<>();
drivers.add(
new
Vector<>(Arrays.asList(
0
,
0
)));
drivers.add(
new
Vector<>(Arrays.asList(
2
,
1
)));
Vector<Vector<Integer>> packages =
new
Vector<>();
packages.add(
new
Vector<>(Arrays.asList(
1
,
2
)));
packages.add(
new
Vector<>(Arrays.asList(
3
,
3
)));
System.out.println(assignPackages(drivers, packages));
}
}