UVa 1149 (贪心) Bin Packing

首先对物品按重量从小到大排序排序。

因为每个背包最多装两个物品,所以直觉上是最轻的和最重的放一起最节省空间。

考虑最轻的物品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\n", cnt);

29     }

30 

31     return 0;

32 }
代码君

 

你可能感兴趣的:(uva)