链接: https://ac.nowcoder.com/acm/contest/297/D
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[1010];
int n,m;
cin>>n>>m;
int i,j;
for(i=0;i<n;i++)
cin>>arr[i];
sort(arr,arr+n);
long long sum=0;
for(i=0;i<n&&sum<m;i++)
{
if(sum+1>=arr[i])//用数学归纳法可以证明
sum+=arr[i];//sum之前的保证都可以被组合出来,那么如果sum+1<arr[i],则表示用上之前所有面值的纸币,都无
//法组合出来sum+1,而且无法加上当前的arr[i],所以sum+1无法被组合。反之,由于1-sum之间的值
//都可以被组合出来,那么sum+1——sum+arr[i]之间所有值一定都可以被组合出来。如果arr[i]==sum+1,
//那么sum+arr[i]-Ki(1<=Ki<=sum)都可以被组合出来。显然1<=arr[i]-Ki<=arr[i].
//如果arr[i]<=sum,那么sum+arr[i]-Ki(1<=Ki<=arr[i]<=sum),显然1<=arr[i]-Ki<=arr[i]。
else
break;
}
if(sum>=m)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}