题目链接:https://ac.nowcoder.com/acm/contest/297/D
先把所有数字按从小到大排序,然后第一个数字必须是 1,如果不是 1 的话首先 1 就 凑不出来。然后下一个面值可以是 1 也可以是 2,但是不可能为 3,因为如果是 3 或者 比 3 还大的话,那么 2 就凑不出来了。所以得到一个递推的规律: 将数字从小到大排序后,如果下一张纸币的面值<=sum 1(sum 为当前纸币的面值 和)。那么这张纸币就能放进来更新 sum,否则就会断掉导致 sum 1 无法被构造出来。 最后再判断一下 sum 是否大于等于 m 就可以了。
---------官方题解
AC代码:
代码语言:javascript复制#include <bits/stdc .h>
#define maxn 1005
#define ll long long
using namespace std;
int n,pre[maxn];
ll m;
int main()
{
scanf("%d%lld",&n,&m);
for(int i=0;i<n;i ){
scanf("%d",&pre[i]);
}
sort(pre, pre n);
ll sum = 0;
for(int i=0;i<n;i ){
if(pre[i] <= sum 1)sum = pre[i];
else break;
}
if(sum >= m)puts("YES");
else puts("NO");
return 0;
}