#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define ll long long
#define F first
#define S second
#define pb push_back

using namespace std;

const ll mx1=3e5+6, mx2=6e3+6, mod=1e9+7, lg=30;

ll a[10];

int main(){
	fast;
	ll sum=0;
	for(int i=0; i<4; i++){
		cin>>a[i];
		sum+=a[i];
	}
	for(int msk=0; msk<(1<<4); msk++){
		ll sum2=0;
		for(int i=0; i<4; i++) if((1<<i)&msk) sum2+=a[i];
		if(sum2*2==sum){
			cout<<"Yes"<<endl;
			exit(0);
		}
	}
	cout<<"No"<<endl;
	return 0;
}

#include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>

// using namespace __gnu_pbds;
using namespace std;

#define fbo find_by_order
#define ook order_of_key
#define fi first
#define se second
#define long long long
#define mul(a, b) ((a*b)%MOD)
#define add(a, b) ((a+b)%MOD)
#define dec(a, b) ((a-b+MOD)%MOD)
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
const int INF = 1e9;
const long LINF = 1e18;
// typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
// mt19937_64 rng(std::chrono::system_clock::now().time_since_epoch().count());
// inv[1] = 1;
// fac[0] = ifac[0] = 1;
// for(int i = 2; i <= 500000; i++) inv[i]=MOD-(MOD/i)*inv[MOD%i]%MOD;
// for(int i = 1; i <= 500000; i++) fac[i] = mul(i, fac[i-1]), ifac[i] = mul(inv[i], ifac[i-1]);
// /mnt/c/Users/vince/Desktop/POST-IOI/  

int main()
{
	// ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	// freopen("input.in", "r", stdin);

	long A[4];
	scanf("%lld %lld %lld %lld", &A[0], &A[1], &A[2], &A[3]);
	sort(A, A+4);
	bool bol = 0;
	do
	{
		if(A[0] == A[1] + A[2] + A[3]) bol = 1;
		if(A[0]+A[1] == A[2] + A[3]) bol = 1;
		if(A[0]+A[1]+A[2] == A[3]) bol = 1;
	}while(next_permutation(A, A+4));

	if(bol) printf("Yes\n");
	else printf("No\n");

}