这是maximum
sum
子集问题的递归关系。
完整的代码是:
if ((mask | u) == u)
dp[u] = max(max(0, dp[u ^ mask] + array[I], dp[u]);
以下if语句到底是什么意思?
if((mask | u) == u)
提前谢谢!
答案 0 :(得分:6)
这表示:“ mask
中u
的所有位都是”。
因此,如果mask
中没有u
中的某个位,则此测试返回false。
例如,对于mask=0b001
和u=0b011
,它返回true
。但是使用mask=0b101
和u=0b011
会返回false
,因为mask
的第三位未在u
中设置。
答案 1 :(得分:2)
OR
的二进制A
,如果 {{1} } 或 B
。这些按位运算扩展到二进制数字的 strings 。在(1)
中,最常表示为A = 1
。
B = 1
(原谅ASCII艺术-更加简洁的插图和链接为here)
C/C++
:integral types
个二进制数字(位)OR | A = 0 | A = 1 |
-----------------------
B = 0 | (0) | (1) |
-----------------------
B = 1 | (1) | (1) |
-----------------------
mask = {m(n - 1), m(n - 2), .., m(1), m(0)}
:(n)
个二进制数字(位)m(i)
让我们考虑 u = {u(n - 1), u(n - 2), .., u(1), u(0)}
: (n)
;如果这些按位比较中的任何为 false ,则表达式 u(i)
的值为 false
在(m(i) | u(i)) == u(i)
表中,我们可以得出结论,当且仅当 i = {0, .., n - 1}
和((mask | u) == u)
时,表达式为假。即: OR
,它不等于等于 m(i) = 1
表达问题的一种更简洁的方法是,如果u(i) = 0
在位置m(i) | u(i) == (1) OR (0) == (1)
上有点{strong>设置为u(i) == 0
,并且{{1} }在相同位置上有点{strong>已清除,mask
,然后(i)
不能等于(1)