classMySolution { private: inthammingDistance(int x, int y){ int res = x % 2 != y % 2; for (int i = 0; i < 31; i++) res += (x >>= 1) % 2 != (y >>= 1) % 2; return res; }
public: /** * @brief * 超时 * @param nums * @param target * @return int */ intfindTargetSumWays(vector<int> &nums, int target){ auto possibilities = 1; longlong max = 0; for (auto num : nums) { max += num; possibilities <<= 1; } vector<longlong> dp(possibilities); dp[possibilities - 1] = max; int count = max == target; for (int i = possibilities - 2; i >= 0; i--) { for (int j = i + 1; j < possibilities; j++) { if (hammingDistance(i, j) == 1) { auto sub = j - i, tmp = 0; while (sub > 0) { sub >>= 1; tmp += 1; } dp[i] = dp[j] - 2 * (nums[nums.size() - tmp]); count += dp[i] == target; break; } } } return count; } };