最近我参加了UF的编程比赛。这是其中一个问题。 http://i.imgur.com/2Fg4MfO.jpg
这是法官的解决方案:http://hastebin.com/unozolusiw.avrasm
这是我不确定的部分。
for (int j = 0; j < N; j++) {
if ((i & (1 << j)) != 0) {
sumR += rs[j];
sumG += gs[j];
sumB += bs[j];
}
}
我理解总和添加部分,N是案例数量,这部分我不明白:
if ((i & (1 << j)) != 0)
我知道什么&amp;和&lt;&lt;但是,我不明白如果你应该将它添加到组合中,如何检查。
答案 0 :(得分:0)
本质上,这会生成所有二进制数(从0到2 ^ N-1)。
如果相应的位非零,则选择颜色以形成组合。
例如,对于6 = 0110,您选择位1和2(从右侧):如果我和 1&lt;&lt;在那个位置j coinide你采取相应的颜色(j)。
i = 0110对j = 0001,0010,0100,1000
(最多有2 ^ N种颜色组合的可能性,这就是为什么pow = 1&lt;&lt; N.)
-
ANDing i和1&lt;&lt; j表示如果它们都有任何公共1位,则检查零意味着它是真的(它们有一些共同的1位);因为1&lt;&lt; j只能有一个非零位(它在不同位置移位1)i&amp; (1&lt;&lt; j)可以具有至多一个共同位:要选择的颜色。
您可以尝试使用此代码查看组合:
int pow = 1 << 5;
boolean works = false;
for (int i = 0; i < pow; i++) {
int sumR = 0;
int sumG = 0;
int sumB = 0;
for (int j = 0; j < 5; j++) {
if((i & (1<<j)) !=0) System.out.println(i+" 22 "+j);
System.out.println(i+" "+j);
}