import
java.util.ArrayList;
import
java.util.List;
public
class
GFG {
static
List<Integer> selectedIdx, remIdx;
static
int
[] flag;
static
int
totalOperations;
static
void
findIndices(
int
capacity,
int
[] weights,
int
[] values,
int
n) {
int
[][] K =
new
int
[n +
1
][capacity +
1
];
for
(
int
i =
0
; i <= n; i++) {
for
(
int
w =
0
; w <= capacity; w++) {
if
(i ==
0
|| w ==
0
)
K[i][w] =
0
;
else
if
(weights[i -
1
] <= w)
K[i][w] = Math.max(values[i -
1
] + K[i -
1
][w - weights[i -
1
]], K[i -
1
][w]);
else
K[i][w] = K[i -
1
][w];
}
}
int
res = K[n][capacity];
totalOperations = res;
int
w = capacity;
for
(
int
i = n; i >
0
&& res >
0
; i--) {
if
(res == K[i -
1
][w])
continue
;
else
{
selectedIdx.add(i -
1
);
flag[i -
1
] =
1
;
res = res - values[i -
1
];
w = w - weights[i -
1
];
}
}
}
public
static
void
main(String[] args) {
int
n =
4
;
int
[] weights = {
1
,
3
,
1
,
3
};
int
sum =
0
;
selectedIdx =
new
ArrayList<>();
remIdx =
new
ArrayList<>();
flag =
new
int
[
400
];
for
(
int
i =
0
; i < n; i++) {
sum += weights[i];
flag[i] =
0
;
}
if
(sum %
2
==
1
) {
System.out.println(-
1
);
return
;
}
sum = (sum /
2
);
findIndices(sum, weights, weights, n);
if
(totalOperations != sum) {
System.out.println(-
1
);
return
;
}
for
(
int
i =
0
; i < n; i++) {
if
(flag[i] ==
0
)
remIdx.add(i);
}
List<Pair<Integer, Integer>> operations =
new
ArrayList<>();
while
(!remIdx.isEmpty() && !selectedIdx.isEmpty()) {
if
(weights[remIdx.get(remIdx.size() -
1
)] >= weights[selectedIdx.get(selectedIdx.size() -
1
)]) {
weights[remIdx.get(remIdx.size() -
1
)] -= weights[selectedIdx.get(selectedIdx.size() -
1
)];
operations.add(
new
Pair<>(remIdx.get(remIdx.size() -
1
), selectedIdx.get(selectedIdx.size() -
1
)));
selectedIdx.remove(selectedIdx.size() -
1
);
}
else
{
weights[selectedIdx.get(selectedIdx.size() -
1
)] -= weights[remIdx.get(remIdx.size() -
1
)];
operations.add(
new
Pair<>(selectedIdx.get(selectedIdx.size() -
1
), remIdx.get(remIdx.size() -
1
)));
remIdx.remove(remIdx.size() -
1
);
}
}
System.out.println(operations.size());
for
(Pair<Integer, Integer> operation : operations)
System.out.println((operation.getFirst() +
1
) +
" "
+ (operation.getSecond() +
1
));
}
static
class
Pair<U, V> {
U first;
V second;
public
Pair(U first, V second) {
this
.first = first;
this
.second = second;
}
public
U getFirst() {
return
first;
}
public
V getSecond() {
return
second;
}
}
}