#include <bits/stdc++.h>
using namespace std;
template <class T>
struct rge {
  T b, e;
};
template <class T>
rge<T> range(T i, T j) {
  return rge<T>{i, j};
}
template <class T>
auto dud(T* x) -> decltype(cout << *x, 0);
template <class T>
char dud(...);
struct debug {
  template <class T>
  debug& operator<<(const T&) {
    return *this;
  }
};
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vb = vector<bool>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
const ld eps = (ld)1e-9;
const ll MOD = (ll)1e9 + 7;
const ld PI = acos(-1);
const int N = (int)5e5 + 5;
template <class T>
T gcd(T x, T y) {
  return (y == 0) ? x : gcd(y, x % y);
}
template <class T>
void mini(T& a, T b) {
  a = min(a, b);
}
template <class T>
void maxi(T& a, T b) {
  a = max(a, b);
}
template <class T, class U>
string to_string(pair<T, U> p) {
  return "" + to_string(p.first) + " " + to_string(p.second) + "";
}
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
class ADawidAndBagsOfCandies {
 public:
  void solve(std::istream& cin, std::ostream& cout) {
    vector<int> a(4);
    for (auto& x : a) cin >> x;
    sort((a).begin(), (a).end());
    vector<string> res = {"YES\n", "NO\n"};
    bool ok = a[0] + a.back() == a[1] + a[2];
    ok |= (a[3] == a[0] + a[1] + a[2]);
    cout << res[!ok] << endl;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout << fixed << setprecision(12);
  ADawidAndBagsOfCandies solver;
  std::istream& in(std::cin);
  std::ostream& out(std::cout);
  solver.solve(in, out);
  return 0;
}
