解题过程

1.获取价格总和上限w,纪念品总件数n
2.循环n次,依次获取纪念品价格,存入数组a[]
3.对数组a从低到高排序
4.贪心算法:定义两个指针i,j(两个int型变量,用来表示数组的下标),i=0,j=n-1
两个指针一起向中间走,每次选择都尽可能的让当前状态下最大值和最小值分在一组,如果不行就让最大值单独分一组,这样分组数才能最少
5.输出分组数

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int w,n;//价格总和上限w,纪念品总件数n
    cin>>w>>n;
    int a[30000];//存放纪念品价格
    int i=0;//数组首元素下标
    int j=n-1;//数组末元素下标
    int count=0;//组数
    //获取每件纪念品价格
    for (int i = 0; i < n; ++i)
    {
        cin>>a[i];
    }

    //排序
    sort(a,a+n);
    //贪心算法
    while(i<=j)
    {
        if (a[i]+a[j]<=w)//将a[i]和a[j]归为一组
        {
            count++;
            i++;
            j--;
        }
        else//将a[j]单独当作一组
        {
            count++;
            j--;
        }
    }
    //输出组数
    cout<<count<<endl;
    return 0;
}