UVa

经典的背包问题 贪心
水题

题意

提供一堆容量为 L 的背包 , 和一堆给定重量的物品 , 每个背包中最多放两个物品 , 求最少用几个背包

思路

经典的贪心 水题
尽量选大的 , 故倒序遍历即可
为了防止重选 故选择了谁就将谁的值记为 L + 1( 即永远不会再被选到 )

第一发WA了是因为忘了题意是每个背包最多放两个物品 , 直接求了最优解 ( 只需要用一个pls标记本次选取的重量总和倒序遍历即可 差别不大 )

AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

const int maxn = 100000 + 100;
int s[maxn];

using namespace std;

int main()
{
    int T;
    cin >> T;
    int pp = T;
    while(T--)
    {
        if( T != pp-1 )
            puts("");
        memset( s,0,sizeof(s) );
        int sum = 0;
        int n, l;
        scanf("%d%d",&n,&l);
        for( int i = 0; i < n; i++ )
            scanf("%d",&s[i]);
        sort(s,s+n);
        int mrk;
        for( mrk = n-1; mrk >= 0; mrk-- ){
            if( s[mrk] + s[0] <= l )
                break;
            else
                s[mrk] = l+1;
        }
        sum += n - mrk - 1;
        for( int i = mrk; i >= 0; i-- ){
            if( s[i] == l + 1 )
                continue;
            for( int j = i-1; j >= 0; j-- ){
                if( s[j] == l+1 )
                    continue;
                if( s[i] + s[j] <= l ){
                    s[j] = l+1;
                    break;
                }
            }
            s[i] = l+1;
            sum++;
        }
        printf("%d
",sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/JinxiSui/p/9740646.html