12个硬币中有1个假币,假币的重量与真币不同,如何用天平最多称量3次找出假币?
12个硬币有24种情况,天平有左斜,右斜和平三种情况,log3(n) >= 24,求得n=3,所以根据信息论的知识,用天平称量三次可以解决这个问题。 将12个银币分为3组,记为A1,A2,A3,A4,B1,B2,B3,B4,C1,C2,C3,C4。
//伪代码 if (A == B) { //A组和B组重量相等,那么假币在C组 if (A1+A2+A3 == C1+C2+C3) { //此时已经知道C4是假币 if (A1 > C4) { System.out.print("C4是更轻的假币"); } else { System.out.print("C4是更重的假币"); } } else if (A1+A2+A3 > C1+C2+C3) { //C1,C2,C3中有一个更轻的假币 if (C1 == C2) { System.out.print("C3是更轻的假币"); } else if (C1 > C2) { System.out.print("C2是更轻的假币"); } else { System.out.print("C1是更轻的假币"); } } } else if (A > B) { //A组有一个更重的假币或者B组有一个更轻的假币。C组全部为真币 if (A1+A2+A3+B1+B2 == A4+C1+C2+C3+C4) { //此时假币在B3,B4或A4之中 if (B3 == B4) { System.out.print("A4是更重的假币"); } else if (B3 > B4) { System.out.print("B4是更轻的假币"); } else { System.out.print("B3是更轻的假币"); } } else if (A1+A2+A3+B1+B2 > A4+C1+C2+C3+C4) { //此时假币在A1,A2或A3之中 if (A1 == A2) { System.out.print("A3是更重的假币"); } else if (A1 > A2) { System.out.print("A1是更重的假币"); } else { System.out.print("A2是更重的假币"); } } else { //此时假币在B1,B2或A4之中 if (B1+A4 == C1+C2) { System.out.print("B2是更轻的假币"); } else if (B1+A4 > C1+C2) { System.out.print("A4是更重的假币"); } else { System.out.print("B1是更轻的假币"); } } } else { //与上述A>B同理,只是这里是A<B }