首先的思路就是贪心。先将所有的纪念品按照价格从低到高进行排序。在分别从左到右、从右到左合并纪念品。如果两端纪念品价格超过了上上限,那么就将较大的那一个纪念品独自放入。否则将两个纪念品一起放入。
#include<bits/stdc++.h> using namespace std; inline int read() { int ret=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();} while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar(); return ret*f; }//读优 int N,W,w[30005],f[30005],top,ans; int main() { W=read();N=read(); for(int i=1;i<=N;i++) w[i]=read(); //到此为读入 sort(w+1,w+N+1);//排序 int l=1,r=N;//初始化l、r坐标 while(l<=r) { if(w[l]+w[r]>W) r--; else l++,r--; ans++;//别忘记加ans } printf("%d ",ans);//输出 return 0; }