排序之后, 尽量最小和最大的放在一个背包, 放不下就放最大的。
#include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 112345; int a[MAXN]; int main() { int n, lmax; int T, kase = 0; scanf("%d", &T); while(T--) { if(kase) puts(""); kase = 1; scanf("%d%d", &n, &lmax); REP(i, 0, n) scanf("%d", &a[i]); sort(a, a + n); int ans = 0; int l = 0, r = n - 1; while(l <= r) { ans++; if(a[l] + a[r] <= lmax) l++, r--; else r--; } printf("%d\n", ans); } return 0; }