我在一个让我困惑的 TopCoder 解决方案中遇到了这段代码。有一个正偶数和奇数整数的数组列表。我认为它返回总和为偶模 MOD 的子集的数量。我相信如果列表很大,MOD 只是为了避免溢出,所以如果你保持数字小于 32,那么我认为你不需要它。
ArrayList l = { ... positive even and odd integers ... };
int dp[] = {1,0};
for (int i = 0; i < l.size(); ++i) {
int even = dp[0];
int odd = dp[1];
if (l.get(i) % 2 == 0) {
even *= 2;
odd *= 2;
} else {
even += odd;
odd = even;
}
dp[0] = even % MOD;
dp[1] = odd % MOD;
}
return (dp[0] - 1 + MOD) % MOD;
如果所有整数都是偶数,那么我认为答案是 2^N-1。但似乎如果至少有一个奇数,答案就变成了 2^(N-1)-1。是对的吗?如果是这样,为什么要跟踪偶数/奇数计数?