`
sony-soft
  • 浏览: 1105194 次
文章分类
社区版块
存档分类
最新评论

三、背包问题

 
阅读更多

*部分背包问题可有贪心法求解:计算Pi/Wi
数据结构:
w[i]:第i个背包的重量;
p[i]:第i个背包的价值;

1.0-1背包: 每个背包只能使用一次或有限次(可转化为一次):

A.求最多可放入的重量。
NOIP2001 装箱问题
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
l 搜索方法
procedure search(k,v:integer); {搜索第k个物品,剩余空间为v}
var i,j:integer;
begin
if v<best then best:=v;
if v-(s[n]-s[k-1])>=best then exit; {s[n]为前n个物品的重量和}
if k<=n then begin
if v>w[k] then search(k+1,v-w[k]);
search(k+1,v);
end;
end;

l DP
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
实现:将最优化问题转化为判定性问题
f [I, j] = f [ i-1, j-w[i] ] (w[I]<=j<=v) 边界:f[0,0]:=true.
For I:=1 to n do
For j:=w[I] to v do F[I,j]:=f[I-1,j-w[I]];
优化:当前状态只与前一阶段状态有关,可降至一维。
F[0]:=true;
For I:=1 to n do begin
F1:=f;
For j:=w[I] to v do
If f[j-w[I]] then f1[j]:=true;
F:=f1;
End;

B.求可以放入的最大价值。
F[I,j] 为容量为I时取前j个背包所能获得的最大价值。
F [i,j] = max { f [ i – w [ j ], j-1] + p [ j ], f[ i,j-1] }

C.求恰好装满的情况数。
DP:
Procedure update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
if j+now<=n then inc(c[j+now],a[j]);
a:=c;
end;

2.可重复背包

A求最多可放入的重量。
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
状态转移方程为
f[I,j] = f [ I-1, j – w[I]*k ] (k=1.. j div w[I])

B.求可以放入的最大价值。
USACO 1.2 Score Inflation
进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。
*易想到:
f[i,j] = max { f [i- k*w[j], j-1] + k*p[j] } (0<=k<= i div w[j])
其中f[i,j]表示容量为i时取前j种背包所能达到的最大值。
*实现:
Begin
FillChar(f,SizeOf(f),0);
For i:=1 To M Do
For j:=1 To N Do
If i-problem[j].time>=0 Then
Begin
t:=problem[j].point+f[i-problem[j].time];
If t>f[i] Then f[i]:=t;
End;
Writeln(f[M]);
End.

C.求恰好装满的情况数。
Ahoi2001 Problem2
求自然数n本质不同的质数和的表达式的数目。
思路一,生成每个质数的系数的排列,在一一测试,这是通法。
procedure try(dep:integer);
var i,j:integer;
begin
cal; {此过程计算当前系数的计算结果,now为结果}
if now>n then exit; {剪枝}
if dep=l+1 then begin {生成所有系数}
cal;
if now=n then inc(tot);
exit;
end;
for i:=0 to n div pr[dep] do begin
xs[dep]:=i;
try(dep+1);
xs[dep]:=0;
end;
end;

思路二,递归搜索效率较高
procedure try(dep,rest:integer);
var i,j,x:integer;
begin
if (rest<=0) or (dep=l+1) then begin
if rest=0 then inc(tot);
exit;
end;
for i:=0 to rest div pr[dep] do
try(dep+1,rest-pr[dep]*i);
end;
{main: try(1,n); }

思路三:可使用动态规划求解
USACO1.2 money system
V个物品,背包容量为n,求放法总数。
转移方程:


Procedure update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
for k:=1 to n div now do
if j+now*k<=n then inc(c[j+now*k],a[j]);
a:=c;
end;
{main}
begin
read(now); {读入第一个物品的重量}
i:=0; {a[i]为背包容量为i时的放法总数}
while i<=n do begin
a[i]:=1; inc(i,now); end; {定义第一个物品重的整数倍的重量a值为1,作为初值}
for i:=2 to v do
begin
read(now);
update; {动态更新}
end;
writeln(a[n]);

分享到:
评论

相关推荐

    背包问题 数学建模 背包问题 数学建模

    背包问题: 01背包问题 02: 完全背包问题 03: 多重背包问题 04: 混合三种背包问题 05: 二维费用的背包问题 06: 分组的背包问题 07: 有依赖的背包问题 08: 泛化物品 09: 背包问题问法的变化 11: 背包问题的搜索解法

    背包问题.rar_matlab算法实现背包问题_价值背包算法_背包最大价值_背包问题_遗传算法 背包

    《基于MATLAB的遗传算法在背包问题中的应用》 背包问题是一种典型的组合优化问题,广泛存在于资源分配、项目选择等领域。在本项目中,我们利用MATLAB强大的计算能力,结合遗传算法,对背包问题进行了有效的求解,以...

    c++解决三维背包问题

    三维背包问题是一个经典的优化问题,常见于计算机科学和运筹学领域,特别是在组合优化和算法设计中。在C++编程中解决这个问题,我们需要理解和运用动态规划(Dynamic Programming, DP)技术。下面将详细介绍如何利用...

    背包问题九讲2.0最新版

    《背包问题九讲》,dd_engi大神原作,从属于《动态规划的思考艺术》系列这系列文章的第一版...4、混合三种背包问题;5、二维费用背包问题;6、分组的背包问题;7、有依赖的背包问题;8、泛化物品;9、背包问题的变化;

    背包问题九讲 2.0 RC1

    背包问题有许多变种,例如完全背包问题、多重背包问题、混合三种背包问题、二维费用的背包问题、分组的背包问题、有依赖的背包问题等。这些变种问题通常在物品的限制条件、背包的限制条件或者物品的价值函数等方面...

    贪心算法 背包问题 c语言

    ### 贪心算法在背包问题中的应用及C语言实现 #### 一、贪心算法简介 贪心算法是一种在每个步骤中都选择局部最优解的策略,希望通过一系列的局部最优选择来达到全局最优解的目的。它适用于某些特定的问题类型,在...

    背包 背包问题 背包算法

    在IT领域,背包问题是一种经典的优化问题,常用于解决资源有限条件下的决策优化。这个问题源自于实际生活中的各种场景,比如包裹打包、投资组合优化、任务分配等。它属于运筹学和组合优化的范畴,同时也是算法竞赛如...

    背包问题九讲

    混合三种背包问题是将前面三种简单的问题叠加成较复杂的问题。解决方法是使用动态规划,定义状态 f[i][v],表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。状态转移方程是 f[i][v]=max{f[i-1][v],f[i...

    背包问题9讲

    4. 混合三种背包问题:这是将01背包问题、完全背包问题以及多重背包问题结合在一起形成的更复杂的问题。解决这类问题需要综合应用不同背包问题的解题策略。 5. 二维费用的背包问题:在传统背包问题中,物品的价值和...

    背包问题九讲(讲述经典的背包问题)

    混合三种背包问题是指将基本的背包问题、完全背包问题和多重背包问题组合起来,解决这个问题需要用到动态规划和贪心算法。 第五讲:二维费用的背包问题 二维费用的背包问题是指每种物品都有两个费用,需要将它们...

    背包问题,详细讲解几种背包问题

    #### 三、经典0/1背包问题 **定义:** 给定N件物品和一个容量为V的背包,第i件物品的重量为ci,价值为wi,每件物品只能选择一次或不选。求解装入背包的物品总价值最大值。 **动态规划思想:** 1. **状态定义:** ...

    经典背包问题九讲.exe

    第三讲 多重背包问题 每种物品有一个固定的次数上限。 第四讲 混合三种背包问题 将前面三种简单的问题叠加成较复杂的问题。 第五讲 二维费用的背包问题 一个简单的常见扩展。 第六讲 分组的背包问题 一种题目类型...

    背包问题九讲.pdf

    #### 四、混合三种背包问题 **4.1 问题** 混合背包问题包含01背包、完全背包和多重背包问题。 **4.2 01背包与完全背包的混合** 可以先解决01背包问题,然后处理完全背包问题。 **4.3 再加上多重背包** 最后...

    背包 问题 九讲

    本文将深入探讨背包问题的三种主要类型,并提供相应的解题策略和算法优化。 P01: 01 背包问题 在01背包问题中,我们有n个物品,每个物品有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品,...

    背包问题九讲(01背包,多重背包,完全背包等)

    三、完全背包问题 完全背包问题与01背包的主要区别在于,每个物品可以被取走任意次,只要不超过背包的容量。这个问题同样可以通过动态规划求解,状态转移方程与01背包类似,但不需要考虑物品是否被选中的情况,因为...

    背包问题(0-1背包,完全背包,多重背包知识概念详解)

    背包问题按照问题的特性可以分为三种类型:0-1背包、完全背包和多重背包。本文将详细解析这三种背包问题的概念、解决方法以及在实际中的应用。 首先,我们来探讨0-1背包问题。这种问题设置了一个简单的前提:假设你...

    背包问题九讲2.0(13年修订版).pdf

    #### 四、混合三种背包问题 **4.1 问题** 在实际问题中,往往会遇到混合了01背包、完全背包和多重背包的问题。即,给定的物品中包含有限次选取、无限次选取和限定次数选取的多种情况。 **4.2 01背包与完全背包的...

    0 1 背包问题 分支界限 回溯+剪枝

    问题描述:给定一个容量为C的背包及n个重量为wi,价值为p1的物品,要求把物品装入背包,是背包的价值最大,此类问题为背包...解决方法:0/1背包问题有多种解决方法,本实验用动态规划,回溯,分支界限三种方法进行解题

Global site tag (gtag.js) - Google Analytics