首先对物品按重量从小到大排序排序。
因为每个背包最多装两个物品,所以直觉上是最轻的和最重的放一起最节省空间。
考虑最轻的物品i和最重的物品j,如果ij可以放在一个包里那就放在一起。
否则的话,j只能自己单独放在一个包里,因为最轻的都不行,其他物品就更不可能和j放在一起了。
如果j可以和多个物品放在一起,那么j和最轻的i放一起,剩下的一定能和除j外最重的放一起。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 100000 + 10; 6 int a[maxn]; 7 8 int main() 9 { 10 //freopen("in.txt", "r", stdin); 11 12 int T; scanf("%d", &T); 13 for(int kase = 0; kase < T; kase++) 14 { 15 if(kase) puts(""); 16 int n, l; 17 scanf("%d%d", &n, &l); 18 for(int i = 0; i < n; i++) scanf("%d", &a[i]); 19 sort(a, a + n); 20 int head = 0, rear = n - 1, cnt = 0; 21 while(head <= rear) 22 { 23 cnt++; 24 if(head == rear) head++; 25 else if(a[head] + a[rear] <= l) { head++; rear--; } 26 else rear--; 27 } 28 printf("%d ", cnt); 29 } 30 31 return 0; 32 }