mod 10 on number of each kind of marbles
then use DP to check if it can be divided in half.
But I can't find a proof or a counter example to show that this algorithm is theoretically correct for this problem. Can anyone help me?? Thanks a lot!!

Moderator: Board moderators
Code: Select all
private static void reduce(){
int chastno = 0;
int ostatak = 0;
// replace 1's with 2's
chastno = n[1] / 2;
ostatak = n[1] % 2;
if (chastno>=0 && chastno % 2 != 0){
chastno--;
ostatak += 2;
}
n[1] = ostatak;
n[2] += chastno;
// replace 2's with 4's
chastno = n[2] / 2;
ostatak = n[2] % 2;
if (chastno>=0 && chastno % 2 != 0){
chastno--;
ostatak += 2;
}
n[2] = ostatak;
n[4] += chastno;
// replace 3's with 6's
chastno = n[3] / 2;
ostatak = n[3] % 2;
if (chastno>=0 && chastno % 2 != 0){
chastno--;
ostatak += 2;
}
n[3] = ostatak;
n[6] += chastno;
// replace 4's with 6's
chastno = n[4] / 3;
ostatak = n[4] % 3;
if (chastno>=0 && chastno % 2 != 0){
ostatak += 3;
chastno--;
}
n[4] = ostatak;
n[6] += 2*chastno;
// replace 5's with 6's
chastno = n[5] / 6;
ostatak = n[5] % 6;
if (chastno>=0 && chastno % 2 != 0){
ostatak += 6;
chastno--;
}
n[5] = ostatak;
n[6] += 5*chastno;
int throwAwayN6 = n[6]-200;
if (throwAwayN6 >=0 ) {
if (throwAwayN6 % 2 == 1) {
throwAwayN6--;
}
n[6] = n[6] - throwAwayN6;
}
}