zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    构建之法阅读笔记02
    四则运算出题2
    初学delphi
    学习进度第一周
    构建之法阅读笔记01
    四则运算出题1
    个人介绍
    每日工作总结08
    构建之法阅读笔记03
    每日工作总结07
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740646.html
Copyright © 2011-2022 走看看