UVA 1149 Bin Packing (贪心,水)

Description:

给出n个物体的长度Li,背包的长度M, 每个背包最多装2个物体,问最少要多少个背包。

Input:

n,Li(0<=i<n),M

Output:

最小背包数

Analysis:

考虑矛盾最集中的地方,体积最大的那个物体,如果他和最小的物体合起来都不能放进一个背包,那么他就只能单独放入一个背包,反之将其和最小的放在一起是不会比最优差的。贪心总是先在矛盾最集中的地方考虑,之后的很多事顺理成章的。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<sstream>
#include<cmath>
#include<iterator>
#include<bitset>
#include<stdio.h>
#include<time.h>
using namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
typedef long long LL;
const int INF = 0xffffff0;
const int MOD = 1e9 + 7;
const int maxn = 100005;

int n,a[maxn],W;
int main() {
	//freopen("C:\\Users\\admin\\Desktop\\in.txt", "r", stdin);
	//freopen("C:\\Users\\admin\\Desktop\\out.txt", "w", stdout);
	int T;scanf("%d",&T);
	int line=0;
	while(T--){
        if(line) puts(" ");
        line=1;
        scanf("%d%d",&n,&W);
        _for(i,0,n)scanf("%d",&a[i]);
        sort(a,a+n);
        int p1=0,p2=n-1;
        int ans=0;
        while(p1<p2){
            if(a[p1]+a[p2]<=W)ans++,p1++,p2--;
            else p2--,ans++;
        }
        if(p1==p2){
            ans++;
        }
        printf("%d\n",ans);
	}


	return 0;
}

猜你喜欢

转载自blog.csdn.net/tomandjake_/article/details/81514175