原题解链接:https://ac.nowcoder.com/discuss/150260

先把所有数字按从小到大排序,然后第一个数字必须是11 ,如果不是11的话首先11就凑不出来。

然后下一个面值可以是11也可以是22 ,但是不可能为33,因为如果是33或者比33还大的话,那么22就凑不出来了。

所以得到一个递推的规律:

将数字从小到大排序后,如果下一张纸币的面值sum+1\leq sum+1( sumsum为当前纸币的面值 和).那么这张纸币就能放进来更新sumsum ,否则就会断掉导致sum+1sum+1无法被构造出来。

最后再判断一下sumsum是否大于等于mm就可以了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long n,m;
long long a[100100];
int main()
{
    //freopen("28.in","r",stdin);
    //freopen("28.out","w",stdout);
	while(~scanf("%lld %lld",&n,&m))
	{
		memset(a,0,sizeof(a));
		long long  sum=0;
		int flag=1;
		for(int i=0;i<n;i++)
		{
			scanf("%lld",&a[i]);
		}
		sort(a,a+n);
		sum=a[0];
		if(a[0]!=1)
		{
			flag=0;
		}
		if(a[0]==1)
		{
			for(int i=1;i<n;i++)
			{
				if(sum>=m)
				{
					break;
				}
				if(a[i]>sum+1)
				{
					flag=0;
					break;
				}
				sum+=a[i];
			}
		}
		if(sum<m)
		{
			flag=0;
		}
		if(flag==1)
		printf("YES\n");
		else
		{
			printf("NO\n");
		}
	}
	return 0;
}