[HDOJ 1171] Big Event in HDU 【完全背包】

题目链接:HDOJ - 1171

 

题目大意

有 n 种物品,每种物品有一个大小和数量。要求将所有的物品分成两部分,使两部分的总大小尽量接近。

 

题目分析

令 Sum 为所有物品的大小总和。那么就是用给定的物品做完全背包,背包容量为 (Sum / 2) ,得到的结果是较小的一部分的大小。

完全背包问题可以使用单调队列优化,O(nm) 。

 

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
 
using namespace std;
 
const int MaxN = 1000 + 5, MaxM = 250000 + 5;
 
int n, Sum, Sum1, A, B, Head1, Tail1, Head2, Tail2;
int V[MaxN], Num[MaxN], Q1[MaxM], Q2[MaxM], f[MaxM];
 
int main()
{
    while (true) {
        scanf("%d", &n);
        if (n < 0) break;
        Sum = 0;
        for (int i = 1; i <= n; ++i) {
            scanf("%d%d", &V[i], &Num[i]);
            Sum += V[i] * Num[i];
        }
        Sum1 = Sum >> 1;
        for (int i = 0; i <= Sum1; ++i) f[i] = 0;
        int Ni, Vi, t;
        for (int i = 1; i <= n; ++i) {
            Ni = Num[i]; Vi = V[i];
            for (int j = 0; j < Vi; ++j) {
                Head1 = Tail1 = 0;
                Head2 = Tail2 = 0;
                for (int k = j, Cnt = 0; k <= Sum1; k += Vi, ++Cnt) {
                    if (Tail1 - Head1 == Ni + 1) {
                        if (Q2[Head2 + 1] == Q1[Head1 + 1]) ++Head2;
                        ++Head1;
                    }
                    t = f[k] - Cnt * Vi;
                    Q1[++Tail1] = t;
                    while (Head2 < Tail2 && Q2[Tail2] < t) --Tail2;
                    Q2[++Tail2] = t;
                    f[k] = Q2[Head2 + 1] + Cnt * Vi;
                }
            }
        }
        B = f[Sum1];
        A = Sum - B;
        printf("%d %d\n", A, B);
    }
    return 0;
}

  

 

posted @   JoeFan  阅读(960)  评论(0编辑  收藏  举报
编辑推荐:
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
阅读排行:
· 我干了两个月的大项目,开源了!
· 千万级的大表,如何做性能调优?
· 推荐一款非常好用的在线 SSH 管理工具
· 盘点!HelloGitHub 年度热门开源项目
· Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,
点击右上角即可分享
微信分享提示