/*
1328.装载问题加强版
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
现在码头有一批重量不同的货物,有三艘装载量不同的货船,试求出能否一次将货物装完
输入
第一行给出货物的数量n(n<=10)
第二行有n个整数,分别表示这n个货物的重量
第三行有3个整数,分别表示三艘货船的载重量
输出
若能够一次装完输出Yes,否则输出No
输入样例
4
1 2 3 4
2 3 5
输出样例
Yes
BY yuan
2014.6.19
At nwpu.xf
*/
#include<stdio.h>
#include<iostream>
using namespace std;
int a[10];
int b[10];
bool mark[10];
bool flag[10];
int w1,w2,w3;
int n,j;
int num=0;
int sum1=0,sum2=0;
int csum1=0,csum2=0;
void backtrack1(int k)
{
if(k>=n){
if(sum1>csum1&&sum1<=w1){
for(int i=0;i<n;i++)
flag[i]=mark[i];
csum1=sum1;}
return;}
sum1+=a[k];
mark[k]=1;
backtrack1(k+1);
sum1-=a[k];mark[k]=0;
backtrack1(k+1);
}
void backtrack2(int k)
{
if(k>=j){
if(sum2>csum2&&sum2<=w2)
csum2=sum2;
return;}
sum2+=b[k];
backtrack2(k+1);
sum2-=b[k];
backtrack2(k+1);
}
void sort()
{int temp;
if(w1>w2)
{temp=w1;
w1=w2;
w2=temp;
}
if(w2>w3)
{
temp=w2;
w2=w3;
w3=temp;
}
if(w1>w2)
{
temp=w1;
w1=w2;
w2=temp;
}
}
int main()
{int k=0,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{cin>>a[i];
mark[i]=0;
flag[i]=0;
num=num+a[i];}
cin>>w1;cin>>w2;cin>>w3;
sort();
backtrack1(0);
for(i=0;i<n;i++)
if(flag[i]==0)
b[j++]=a[i];
backtrack2(0);
if(num-csum1-csum2<=w3)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}