很明显就是一道关于背包的贪心问题
那么根据贪心策略 固定容量的背包,装多样物品,使得背包数最小
首先把大的装入背包,如果能匹配到一个最小的,他们的和小于容量就是优解 因为之前的最小的,会为后面稍大的提供空间,否则剩余的会超出容量达不到最优
(我记得紫书上有讲)

#include <bits/stdc++.h>
#define  ll  int
using namespace std;
ll a[30010];
bool vis[30010];///标记数组
int main()
{
   ll we;
   cin>>we;
   ll n;
   cin>>n;
   for (int i=0;i<n;++i)cin>>a[i];
   sort(a+0,a+n);///从小到大排序
   ll cnt=0;
   ll j=0;
   ll k=n-1;///双指针从中取大物品的同时,匹配到合适的小物品
   for (;;++j)
   {
    if (j>=k)
      break;
    for (;;--k)
    {
      if (a[j]+a[k]<=we)
      {
        ++cnt;
        vis[j]=vis[k]=1;///标记已经放入背包
        --k;
        break;
      }
    }
   }
   for (int i=0;i<n;++i)
   {
    if (vis[i]==0)++cnt;///处理剩余的单个装入背包中的
   }
   cout<<cnt<<endl;
    return 0;
}