十二、背包问题

时间:2020-01-24 16:34:32   收藏:0   阅读:94

12.1 0/1 背包问题

12.1.1 题目模型

12.1.2 基本思路

12.1.3 例题

Description

给定 n 种物品和一个容量为 V 的背包,物品 i 的体积是 \(v_i\) ,其价值为 \(c_i\)。问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?

Input

  • 第一行为两个正整数 nV ,表示有 n 件物品,背包容量为 V \(( 1\le n\le 1000, 1\le V\le 10000)\)
  • 接下来n 行,每行两个正整数 \(v_i, c_i\) 表示第i 件物品的体积和价值。

Output

  • 只有一行,为能放入背包的最大价值。

Sample Input

4 8
2 3
3 4
4 5
5 6

Sample Output

10

12.1.4 空间优化

12.1.5 0/1 背包初始化细节

12.2 完全背包

12.2.1 题目模型

12.2.2 基本思路

12.2.3 优化

  1. 若两件物品 i,j满足 v[i]<=v[j]c[i]>=c[j],则将物品j去掉,不用考虑。

    • 显然任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。
    • 对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。
    • 并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。
  2. 将费用大于V的物品去掉。

  3. 使用类似计数排序的做法,计算出费用相同的物品中价值最高的是哪个,可以O(V+N)地完成这个优化。

    注意:以上优化并不能从实质上提高时间效率,不过也是在数据比较大的情况下,特别是随机数据有很明显的提升。

12.3 多重背包问题

12.3.1 题目模型

12.3.2 基本思路

12.3.3 二进制拆分优化

12.3.4 O(VN)的算法

12.4 混合三种背包问题

12.5 二维费用的背包问题

12.5.1 题目模型

12.5.2 基本思路

12.6 分组的背包问题

12.6.1 题目模型

12.6.2 基本思路

12.7 例题

12.7.1 HDU - 2546 饭卡

题目大意

电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有 \(n\) 种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。

样例
样例输入 1
10
1 2 3 2 1 1 2 3 2 1
50
样例输出 1
32
样例 1 说明

有 10 种菜,结果自己算吧

样例输入2
1
50
5
样例输出2
-45
样例 2 说明

只有一种菜,价格为 \(50\),卡上余额 \(5\) 元,此时买这个菜,剩余 \(-45\)

分析
部分代码
暂时不想写了

12.7.2 POJ - 2184 Cow Exhibition 题解

题目大意

\(N(N \le 100)\) 头奶牛,没有头奶牛有两个属性 \(s_i\)\(f_i\),两个范围均为 \([-1000, 1000]\)
从中挑选若干头牛,\(TS = \sum s[choose], TF = \sum f[choose]\)
求在保证 \(TS\)\(TF\) 均为非负数的前提下,\(TS+TF\)最大值。

样例
有 5 头牛,下面分别是每头牛的两个属性
5
-5 7
8 -6
6 -3
2 1
-8 -5
选择第 1、3、4 三头牛为最优解
虽然加上 2 号,总和会更大,但是 TF 会变成负数,不合法
分析
部分代码
心情好的时候再加

12.7.3 HDU - 3591 Coins 题解

题目大意

\(N\) 种不同面值的硬币,分别给出每种硬币的面值 \(v_i\) 和数量 \(c_i\)。同时,售货员每种硬币数量都是无限的,用来找零。
要买价格为 \(T\) 的商品,求在交易中最少使用的硬币的个数(指的是交易中给售货员的硬币个数与找回的硬币个数之和)。
个数最多不能超过 \(20000\),如果不能实现,输出 \(-1\);否则输出此次交易中使用的最少的硬币个数。

样例

\(3\) 种硬币,面值分别为 \(5, 25 50\),个数分别为 \(5, 2, 1\),要买 \(70\) 的商品,不存在给小费的情况下,最少的硬币个数为 \(3\)
自己使用 \(25\)\(50\) 各一个,找回一个面值为 \(5\) 的硬币。

分析
部分代码
还没顾上写;

原文:https://www.cnblogs.com/hbhszxyb/p/12232305.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!