官方题解:
为什么要要求 下一张的纸币面值<=sum+1?
sum为前面所有纸币的和,如果下一张纸币为 sum+2,那么sum+1这一个面值的商品就无法购买。此时跳出循环,小于等于sum的商品均能购买,和m比较一下即可。
///#include<bits/stdc++.h>
///#include<unordered_map>
///#include<unordered_set>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<set>
#include<stack>
#include<map>
#include<new>
#include<vector>
#define MT(a,b) memset(a,b,sizeof(a));
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const double E=2.718281828459;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
int main()
{
ll n,m,money[1005],sum=0;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&money[i]);
sort(money+1,money+1+n);
for(int i=1;i<=n;i++)
{
if(money[i]>sum+1)
break;
sum+=money[i];
}
printf(sum>=m?"YES\n":"NO\n");
return 0;
}