国家集训队2009论文集浅谈几类背包题

国家集训队2009论文集浅谈几类背包题
国家集训队2009论文集浅谈几类背包题

浅谈几类背包题

浙江省温州中学徐持衡指导老师:舒春平

2008年12月

目录

摘要 (3)

关键字 (3)

正文 (4)

一、引言 (4)

二、背包的基本变换 (5)

①完全背包 (5)

②多次背包 (5)

③单调队列优化☆ (6)

三、其他几类背包问题 (8)

①树形依赖背包(获取学分)☆ (8)

②PKU3093☆ (11)

四、总结 (12)

附录 (13)

参考文献 (13)

文中原题 (13)

摘要

背包问题作为一个经典问题在动态规划中是很基础的一个部分,然而以0-1背包问题为原题,衍生转变出的各类题目,可以说是千变万化,当然解法也各有不同,如此就有了继续探究的价值。

本文就4道背包变化的题做一些探讨研究,提出本人的一些做法,希望能起到抛砖引玉的作用。

关键字

动态规划背包优化

正文

一、引言

背包问题是运筹学中的一个经典的优化难题,是一个NP-完全问题,但其有着广泛的实际应用背景,是从生活中一个常见的问题出发展开的:一个背包,和很多件物品,要在背包中放一些物品,以达到一定的目标。

在信息学中,把所有的数据都量化处理后,得到这样的一个问题:

0-1 背包问题:给定n 件物品和一个背包。物品i的价值是W i,其体积为V i,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。

在选择装入背包的物品时,对每件物品i ,要么装入背包,要么不装入背包。不能将物品i 多次装入背包,也不能只装入部分物品i (分割物品i)。因此,该问题称为0-1 背包问题。

用于求解0-1背包问题的方法主要有回溯算法、贪婪算法、遗传算法、禁忌搜索算法、模拟退火算法等。

在高中阶段,我们所谓的经典0-1背包问题,保证了所有量化后的数据均为正整数,即是一个特殊的整数规划问题,本文中如无特殊说明均以此为前提。其经典的O(n*C)动规解法是:

状态是在前i件物品中,选取若干件物品其体积总和不大于j,所能获得的最大价值为F i[j],当前的决策是第i件物品放或者不放,最终得到转移方程:

F i[j] = F i-1[j] (V i>j>=0)

F i[j] = max{ F i-1[j] , F i-1[j-V i]+W i } (C>=j>=V i)

其中由于F i只与F i-1有关,可以用滚动数组来节省程序的空间复杂度。以下就是经典算法的伪代码。

1.FOR i: = 1 TO n

2. FOR j: = C DOWNTO V i

3. Max ( F[ j ] , F[ j-V i ] + W i ) → F[ j ]

4. END FOR

5.END FOR

二、背包的基本变换

①完全背包

完全背包问题:给定n 种物品和一个背包。第i种物品的价值是W i,其体积为V i,背包的容量为C,同一种物品的数量无限多。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。

这个问题完全可以转化为0-1背包问题来解决,即把第i种物品分割成

(C div V i)件物品,再用0-1背包问题的经典动规实现。

但是,这个算法的时间复杂度太高,并不能作为一种实用的方法来实现。

很容易注意到,这个问题对于0-1背包来说,是另一个极端,每种物品都可以无限制地取,只要改变转移方程,就可以构造出新的算法:状态是在前i种物品中,选取若干件物品其体积总和不大于j,所能获得的最大价值为F i[j],当前的决策是第i件物品放(多件)或者不放,转移方程是

F i[j] = F i-1[j] (V i>j>=0)

F i[j] = max{ F i-1[j] , F i[j-V i]+W i } (C>=j>=V i) //注意第二个是F i而不是

F i-1,与0-1背包区别仅在于此,因为允许在放过的基础上再增加一件。

这样,这个问题就有了与0-1背包一样时间复杂度O(n*C)的解决方法,同样的可以用滚动数组来实现。

1.FOR i: = 1 TO n

2. FOR j: = V i TO C

3. Max ( F[ j ] , F[ j-V i ] + W i ) → F[ j ]

4. END FOR

5.END FOR

②多次背包

多次背包问题:给定n 种物品和一个背包。第i种物品的价值是W i,其体积为V i,数量是K i件,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。

和完全背包一样,可以直接套用0-1背包问题的经典动规实现,但是效率太低了,需要寻找更高效的算法。

首先对于第i种物品,不能确定放多少件才是最优的,因为并没有什么可以证明放一件或者全放一定会更优。换句话说,最优解所需要的件数,可能是0到K i中的任何数。

在日常生活中,如果需要能拿得出1到K i的任意整数数额的钱,往往

不会带K i个一元钱,因为那实在是太不方便了,取而代之的是带一些1元和其他一些面值各不相同的非1数额的钱。

这种思想完全可以运用到这道题上!

不需要把一种物品拆分成K i份,而是只要物品拆分到能凑出1到K i 之间任意数量的程度就可以了。

可以证明,按照二进制的拆分能使件数达到最小,把K i拆分成1,2,4…2t,K i-2t+1+1(2t+2>K i>=2t+1),就一定可以满足最优解要求了。下一步,还是用0-1背包的经典算法。

如此,我们得到了一个时间复杂度为O(C*∑([log

2K

i

]))的算法。

1.FOR i: = 1 TO n

2. 1 → m

3. WHILE K i > 0

4. IF m > K i THEN K i→ m

5. K i– m → K i

6. FOR j: = C DOWNTO V i * m

7. Max( F[ j ] , F[ j-V i*m ] + W i * m ) → F[ j ]

8. END FOR

9. m * 2 → m

10. WEND

11.END FOR

此算法还能加上一个优化,判断如果K i大于C/V i,则多出的部分是没有意义的,可以舍去。时间复杂度就可以优化到O(n*C*log2C)。由于在高中阶段碰到的题中C的值很有限,所以这个算法在实际应用上的效果已经可能满足一般的需求了。

但是在下一节中,有一个更高效的解决方法。

③单调队列优化☆

长度限制最大连续和问题:给出长度为n 的序列X i,求这个序列中长度不超过l max的最大连续和。

首先考虑最简单的做法,就是直接用O(n*l max)的二次循环求最大值:

1.FOR i: = 1 TO n

2. 0 → s

3. FOR j: = i DOWNTO Max( i-l max+1 ,1)

4. s + X j→ s

5. IF s > ans THEN s → ans

6. END FOR

7.END FOR

用S i记X1到X i的总和,就可以看到,如果确定一个端点后,要做的就是在S数组的一个连续区间取一个最值,区间最值问题完全可以用线段树来实现。

但是这个题目的另一个特性是区间的长度是固定的,而且每个区间都只需要取一次,所以我们可以用更简单的数据结构来实现——单调队列。

先来研究一下单调队列,以维护最大值为例,在满足序列中的编号递

i+1i i-1i-1i i+1

单调队列除队列首元素出队列外,还需要用一定的操作来维护队列的特殊性质。如果进入了一个新的元素(a,b),其中a必然大于A R,但是b可能会大于等于B R。既然b大于等于B R,而元素R又是要先于新元素出队列,那么元素R就已经失去价值,因为接下来新元素必然都会比元素R更优。所以现在就可以删除元素R了。

重复上面的步骤,直到前面没有元素或者满足B R>b为止,再让新元素进队列。显然,当前的队列首元素,必定是这个区间的最大值。

1.PROCEDURE INSERT a , b

2. WHILE R >= L AND b > B[ R ] DO R - 1 → R

3. R + 1 → R

4. a → A[ R ]

5. b → B[ R ]

6.END

如此完成的单调队列,虽然不能保证每一次的操作是O(1),但是因为每个元素只进队列一次,并出队列一次,所以总效率是O(n)。

当然,这道题其实就是单调队列的基本功能,而我们希望的是能把它

用来优化背包问题,所以现在重新考虑多次背包问题。

对于第i种物品来说,已知体积v,价值w,数量k,那么可以按照当

现在看到分组以后,编号j可以从j-k到j-1中的任意一个编号转移而来(因为相邻的体积正好相差v),这看上去已经和区间最大值有点相似了。

但是注意到由于体积不一样,显然体积大的价值也会大于等于体积小的,直接比较是没有意义的,所以还需要把价值修正到同一体积的基础上。比如都退化到d,也就是说用F[j*v+d]- j*w来代替原来的价值进入队列。

对于第i件物品,转移伪代码:

1.FOR d: = 0 TO v-1 //枚举余数,分开处理

2.清空队列

3. FOR j: = 0 TO (C-d) div v //j枚举标号,对应体积为j*v+d

4. INSERT j , F[ j*v+d ] – j * w //插入队列

5. IF A[ L ] < j - k THEN L + 1 → L //如果队列的首元素已经失效

6. B[ L ] + j * w → F[ j*v+d ] //取队列头更新

7. END FOR

8.END FOR

已知单调队列的效率是O(n),那么加上单调队列优化以后的多次背包,效率就是O(n*C)了。

三、其他几类背包问题

①树形依赖背包(选课)☆

树形依赖背包问题:给定n 件物品和一个背包。第i件物品的价值是W i,其体积为V i,但是依赖于第X i件物品(必须选取X i后才能取i,如果无依赖则X i=0),依赖关系形成森林,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。

这道题需要在treedp的基础上用背包实现。

1泛化物品——定义:

考虑这样一种物品,它并没有固定的费用(体积)和价值,而是它的价值随着你分配给它的费用(体积)变化而变化。

泛化物品可以用一个一维数组来表示体积与价值的关系G j表示当体积为j的时候,相对应的价值为G j(C>=j>=0)。

显然,之前的背包动规数组F i,就是一件泛化物品,因为F i[j]表示的正是体积为j的时候的最大价值。同样的,多件物品也是可以合并成一件泛化物品。

泛化物品的和:

把两个泛化物品合并成一个泛化物品的运算,就是枚举体积分配给两个泛化物品,满足:

G[j] = max{ G1[j-k] + G2[k] } (C>=j>=k>=0)

把两个泛化物品合并的时间复杂度是O(C^2)。

对于具有树形依赖关系的背包问题,我们可以把每棵子树看作是一个泛化物品,那么一棵子树的泛化物品就是子树根节点的这件物品的泛化物品与由根所连的所有子树的泛化物品的和。

整个动规过程就是从叶子进行到根,对于每一棵子树的操作就是:

1.PROCEDURE DEAL i , v , w //第i个节点体积为v 价值为w

2. FOR j: = v TO C //初始化这件泛化物品

3. w → F i[ j ]

4. END FOR

5. FOR s: = 1 TO n

6. IF s 是 i 的儿子 THEN

7. F i与 F s的和→ F i

8. END IF

9. END FOR

10.END

一次只能把两个泛化物品合并,那么要把n个泛化物品合并成一个就需要n-1次合并,所以这个算法效率是O(n*C2+n2) ,当然,其中的O(n2)可以用邻接表的记边方法变成O(n),最终的效率就是O(n*C2)。

1“泛化物品”一词最初在DDengi的《背包九讲》中出现,下文中的“泛化物品的和”也引自《背包九讲》

回顾经典0-1背包问题,在那个经典算法中,求泛化物品与一件物品的和,只需要O(C)的时间复杂度,推论出:

泛化物品与一件物品的和:

把一个泛化物品与一件物品合并成一个泛化物品,可以用类似于0-1背包经典动规的方法求出。

G[j] = G1[j] (v>j>=0)

G[j] = max{ G1[j] , G1[j-v]+w } (C>=j>=v)

这样的合并,时间复杂度仅为O(C),同样也是合并了一件物品,效率比求两件泛化物品的和快很多。那么有没有办法用这种O(C)的合并方式来代替计算两个泛化物品的和来处理这道题呢?

泛化物品的并:

因为两个泛化物品之间存在交集,所以不能同时两者都取,那么我们就需要求泛化物品的并,对同一体积,我们需要选取两者中价值较大的一者,效率O(C)。

G[j] = max{ G1[j] , G2[j] } (C>=j>=0)

重新考虑对以i为根的子树的处理,假设当前需要处理i的一个儿子s。

如果我们在当前的F i中强制放入物品s后作为以s为根的子树的初始状态的话,那么处理完以s为根的子树以后,F s就是与F i有交集的泛化物品(实际上是F s包含F i),同时,F s必须满足放了物品s,即F s[j] (V s>j>=0)已经无意义了,而F s[j](C>=j>=V s)必然包含物品s。为了方便,经过处理以后,在程序中规定只有F s[j](C-V s>=j>=0)是合法的。

接下来只需要把F s与F i的并赋给F i,就完成了对一个儿子的处理。如此,我们需要的总时间复杂度仅为O(n*C)。

1.PROCEDURE DEAL i , C

2.FOR s: = 1 TO n

3. IF s 是 i 的儿子 THEN

4. F i→ F s

5. DEAL s , C – V s //背包容量减小V s

6. FOR K: =V s TO C //求两者的并

7. Max ( F i[ k ] , F s[ k-V s ] + W s ) → F i[ k ]

8. END FOR

9. END IF

10. END FOR

11.END

2用这个算法,可以把《选课》这一类题优化到O(n*C),亦可以作为noip06《金明的预算方案》的O(n*C) treedp解法。

②PKU3093☆

PKU3093:给定n 件物品和一个背包,第i件物品的体积为V i,背包的容量为C。

要求把一些物品放入背包使得剩下的物品都放不下,求方案数。

暂时先不考虑“使剩下的物品都放不下”的条件,那就是求0-1背包的所有可行方案。

用F i[j]表示前i件物品中选若干件总体积为j的方案数,初始为F0[0]=1,转移方程是:

F i[j] = F i-1[j] (Vi>j)

F i[j] = F i-1[j] + F i-1[j-Vi](j>=Vi)

显然这个算法的效率是O(n*C)的,它计算了所有装放背包的方案数。

现在考虑“使剩下的物品都放不进去”的条件,如果剩下的物品中体积最小为v,那么方案数就是sum{ F n[j] }(C>=j>C-v)。前提是我们事先确定了剩下中体积最小的是哪个。

对体积排序后,下一步就是枚举i作为剩余物品中体积最小的一件。对于所有si的物品做0-1背包可行方案的统计,将sum{ F n[j] }(C>=j>C-V i)累加到ans。

由于每次都需要对n-i件物品做统计,一共统计n次,效率是O(n2*C)。

1.0 → sum //sum记1到i-1的物品体积总和

2.FOR i: = 1 TO N

3. F数组清零

4. 1 → F[ sum ] //初始化

5. FOR s: = i + 1 TO N //统计可行方案数

6. FOR j: = C DOWNTO V s + sum

7. F[ j ] + F[ j-V s ] → F[ j ]

8. END FOR

9. END FOR

10. FOR k: = C DOWNTO C - V i + 1 //累加总方案数

11. IF k >= sum THEN ans + F[ k ] → ans

2在附录中有两道原题以及我的程序。在论文完成之后,经TKY提醒发现,同样效率的算法已经在07年的《浅谈数据的合理组织》(何森)中被提及,所以这个算法只能算是另一种更简单的O(n*C)实现方法。

12. END FOR

13. sum + V i→ sum

14.END FOR

可以发现,同一个物品多次被考虑放入背包,这样会造成时间的浪费。

观察得到,第i件物品共考虑了i-1次。每一次循环都会少一件物品。如果把整个过程倒置,每件物品是否可以只考虑一次呢?

由于初始状态不一样,我们还需要把初始状态统一。可以让每次F[0]=1,总容量为C-sum。

但是只统一初始化状态还不够,因为每次的背包容量还是不同的,做背包统计的时候,背包容量不可以是一个变值,也必须要统一,所以每次考虑一件物品都要用最大容量C来更新背包。

一次操作之后要将sum{ F[j] }(C-sum>=j>C-sum-V i , j>=0)累加到ans。

现在,每件物品都只考虑一次,背包体积统一是C,那么效率就变成了O(n*C)。

1.0 → sum

2. 1 → F[ 0 ]

3.FOR i: = 1 TO n

4. sum + V i→ sum

5.END FOR

6.FOR i: = n DOWNTO 1

7. sum - V i→ sum

8. FOR j: = C - sum DOWNTO Max( C – sum – V i + 1 , 0 )//累加总方案数

9. ans + F[ k ] → ans

10. END FOR

11. FOR j: = C DOWNTO V i //考虑第i件物品放入背包

12. F[ j ] + F[ j – V i ] → F[ j ]

13. END FOR

14.END FOR

四、总结

回顾全文的四道背包题:对于完全背包问题,用转化方程就解决了;对于多次背包,使用了单调队列优化来实现O(n*C)的效率;在树形依赖背包问题中,

探索了新的概念,最终完成算法的转化;而在PKU3093一题中,通过合并相似操作来达到优化的效果。

虽然用到的方法各不相同,每个方法都不仅仅限于背包问题,完全可以灵活运用到其他问题中。

凡是文中提到的问题最后都用时间复杂度O(n*C)的算法解决了,这并不是说所有背包题都可以优化到这个程度,但是,可以肯定的是不会有比这个更快的效率了。

就目前来说,背包类的题目还有很多没有得到很好的解决,等待着大家去继续探索研究。

附录

参考文献:

《背包九讲》——DDengi,ZJU

文中原题

来源:ctsc97

1.选课

大学里实行学分。每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分。学生最后的学分是他选修的各门课的学分的总和。

每个学生都要选择规定数量的课程。其中有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如,《数据结构》必须在选修了《高级语言程序设计》之后才能选修。我们称《高级语言程序设计》是《数据结构》的先修课。每门课的直接先修课最多只有一门。两门课也可能存在相同的先修课。为便于表述每门课都有一个课号,课号依次为1,2,3,……。下面举例说明

上例中1是23,

那么1和2都一定已被选修过。

学生不可能学完大学所开设的所有课程,因此必须在入学时选定自己要学的课程。每个学生可选课程的总数是给定的。现在请你找出一种选课方案,使得你能得到学分最多,并且必须满足先修课优先的原则。假定课程之间不存在时间上的冲突。

输入

输入文件的第一行包括两个正整数M、N(中间用一个空格隔开)其中M表示待选课程总数(1≤M≤1000),N表示学生可以选的课程总数(1≤N≤M)。

以下M行每行代表一门课,课号依次为1,2……M。每行有两个数(用一个空格隔开),第一个数为这门课的先修课的课号(若不存在先修课则该项为0),第二个数为这门课的学分。学分是不超过10的正整数。

输出

输出文件第一行只有一个数,即实际所选课程的学分总数。以下N行每行有一个数,表示学生所选课程的课号。

输入输出示例

INPUT.TXT

7 4

2 2

0 1

0 4

2 1

7 1

7 6

2 2

OUTPUT.TXT

13

2

6

7

3

《选课》的源代码

1.var

2.n,C,i:longint;

3.x,w:array[1..400]of longint;

4.f:array[0..400,0..400]of longint;

5.

6.procedure dfs(k,C:longint);

7.var

8.i,j:longint;

9.begin

10. if C<=0 then exit;

11. for i:=1 to n do if x[i]=k then begin

12. for j:=0 to C-1 do f[i,j]:=f[k,j]+w[i];//强制放入物品i

13. dfs(i,C-1);

14. for j:=1 to C do

15. if f[i,j-1]>f[k,j] then

16. f[k,j]:=f[i,j-1]; //求两者的并

17. end;

18.end;

19.

20.begin

21. readln(n,C);

22. for i:=1 to n do begin

23. readln(x[i],w[i]); //读入父节点标号x[i] 和学分w[i]

24. end;

25. dfs(0,C); //以0作为所有没有父节点的点的父亲

26. writeln(f[0,C]);

27.end.

来源:NOIP2006第二题

2.金明的预算方案

(budget.pas/c/cpp)

【问题描述】

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,j k,则所求的总和为:

v[j1]*w[j1]+v[j2]*w[j2]+ …+v[j k]*w[j k]。(其中*为乘号)

请你帮助金明设计一个满足要求的购物单。

输入文件budget.in 的第1行,为两个正整数,用一个空格隔开:

N m

(其中N(<32000)表示总钱数,m(<60)为希望购买物品的个数。)

从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数

v p q

(其中v表示该物品的价格(v<10000),p表示该物品的重要度(1~5),q表示该物品是主件还是附件。如果q=0,表示该物品为主件,如果q>0,表示该物品为附件,q是所属主件的编号)

【输出文件】

输出文件budget.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。

【输入样例】

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

2200

1.var

2.n,C,i:longint;

3.x,w,v:array[1..60]of longint;

4.f:array[0..60,0..3200]of longint;

5.procedure dfs(k,C:longint);

6.var i,j:longint;

7.begin

8. if C<=0 then exit;

9. for i:=1 to n do if x[i]=k then begin

10. for j:=0 to C-v[i] do f[i,j]:=f[k,j]+w[i]; //强制放入物品j

11. dfs(i,C-v[i]);

12. for j:=v[i] to C do

13. if f[i,j-v[i]]>f[k,j] thenf[k,j]:=f[i,j-v[i]];//求两者的并

14. end;

15.end;

16.begin

17. assign(input,'budget.in');reset(input);

18. assign(output,'budget.out');rewrite(output);

19. readln(C,n);

20. c:=c div 10;

21. for i:=1 to n do begin

22. readln(v[i],w[i],x[i]); //读入费v[i] 重要度w[i] 父节点标号x[i]

23. w[i]:=w[i]*v[i];

24. v[i]:=v[i] div 10;

25. end;

26. dfs(0,C); //以0作为所有没有父节点的点的父亲

27. writeln(f[0,C]);

28. close(output);

29.end.

来源:Pku 3093

Margaritas on the River Walk

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 694 Accepted: 271

Description

One of the more popular activities in San Antonio is to enjoy margaritas in the park along the river know as the River Walk. Margaritas may be purchased at many establishments along the River Walk from fancy hotels to Joe’s Taco and Margarita stand. (The problem is not to find out how Joe got a liquor license. That involves Texas politics and thus is much too difficult for an ACM contest problem.) The prices of the margaritas vary depending on the amount and quality of the ingredients and the ambience of the establishment. You have allocated a certain amount of money to sampling different margaritas.

Given the price of a single margarita (including applicable taxes and gratuities) at each of the various establishments and the amount allocated to sampling the margaritas, find out how many different maximal combinations, choosing at most one margarita from each establishment, you can purchase. A valid combination must have a total price no more than the allocated amount and the unused amount (allocated amount – total price) must be less than the price of any establishment that was not selected. (Otherwise you could add that establishment to the combination.)

For example, suppose you have $25 to spend and the prices (whole dollar amounts) are:

Then possible combinations (with their prices) are:

ABC(25), ABD(24), ABJ(22), ACD(23), ACJ(21), ADJ( 20), AH(24), BCD(24), BCJ(22), BDJ(21), BH(25), CDJ(20), CH(24), DH(23) and HJ(21).

Thus the total number of combinations is 15.

Input

The input begins with a line containing an integer value specifying the number of datasets that follow, N(1 ≤ N≤ 1000). Each dataset starts with a line containing two

integer values V and D representing the number of vendors (1 ≤ V≤ 30) and the dollar amount to spend (1 ≤ D≤ 1000) respectively. The two values will be separated by one or more spaces. The remainder of each dataset consists of one or more lines, each containing one or more integer values representing the cost of a margarita for each vendor. There will be a total of V cost values specified. The cost of a margarita is always at least one (1). Input values will be chosen so the result will fit in a 32 bit unsigned integer.

Output

For each problem instance, the output will be a single line containing the dataset number, followed by a single space and then the number of combinations for that problem instance.

Sample Input

2

6 25

8 9 8 7 16 5

30 250

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

Sample Output

1 15

2 16509438

Hint

Note: Some solution methods for this problem may be exponential in the number of vendors. For these methods, the time limit may be exceeded on problem instances with a large number of vendors such as the second example below.

Source

Greater New York 2006

国家集训队2004论文集 肖天

“分层图思想”及其在信息学竞赛中的应用 天津市南开中学肖天 【摘要】本文通过对几道信息学竞赛题的解决,提出了一种解决问题的建模思想——分层图思想。该思想通过挖掘问题性质,将原问题抽象得出的图复 制为若干层并连接形成更大的图,使本来难以用数学语言表达得图论模 型变得简明严谨,为进一步解决问题打下了良好的基础。 【关键字】分层图思想图论数学模型最短路信息学竞赛 【正文】 1 引论 人们在借助计算机解决一个实际问题时,无非就是详细地告诉计算机应该怎么做,使它能通过人们给定的输入得到人们想要的输出。由于一般的计算机只能处理数字信号,所以只有把实际问题转化为数学问题,计算机才能帮助我们。这一步就是建立数学模型。 数学模型的建立在通过计算机解决问题的过程中非常重要。它把计算机无法理解的问题加以转化,使一切事物量化,最终变为只含数学过程的问题。它是人脑与计算机沟通的桥梁。不仅如此,数学模型的好坏直接影响着人与计算机之间的信息交流,影响着计算机对问题的“理解”。好的数学模型能够抓住问题的本质,表述简捷明了,易于人们找到有效的解决方法,并通过编制程序的方式将解决方法告诉计算机;相反,对于同一个问题,如果数学模型不能抓住问题本质,人们就可能无法解决问题,或者找不到有效的方法,更不用提告诉计算机如何做了。 由于建立数学模型是为了解决问题,所以人们在做这项工作时往往希望把问题归结为已经很好解决的经典问题或若干这样问题的有机结合。这样,只要应用前人的研究成果就可以了。比如,排序、求图的单源最短路、网络流等等都是经典问题,前人不仅给出一般解法,而且对各种特殊情况和变形作了深入的研究。但事情并不总像人们希望的那样,有的问题即使可以归结为已有问题,在其中加入一些干扰因素后,原有性质就会发生改变,原来建立起的数学模型难以再用严谨的数学语言表达。这样问题中的部分图论问题可以用本文提出的“分层图思想”解决。 该思想注重对原问题性质的挖掘,通过对原问题数学模型的扩展,将干扰因素融入新的数学模型之中,恢复了模型的严谨性,进而与已解决问题产生联系,得到有效算法。

国家旅游局质量规范与管理司关于进一步规范《国际旅行社业务经营

国家旅游局质量规范与管理司关于进一步规范《国际旅行社业务经营许可证》换发及变更的通知 【法规类别】旅游综合规定 【发文字号】旅管理函[2008]16号 【发布部门】国家旅游局 【发布日期】2008.02.02 【实施日期】2008.02.02 【时效性】现行有效 【效力级别】部门规范性文件 国家旅游局质量规范与管理司关于进一步规范《国际旅行社业务经营许可证》换发及变 更的通知 (旅管理函〔2008〕16号) 各省、自治区、直辖市旅游局(委): 为了进一步规范《国际旅行社业务经营许可证》的换发和变更,现根据《旅行社管理条例》及实施细则,就有关事项通知如下: 一、《国际旅行社业务经营许可证》有效期为三年,国际旅行社应当在《国际旅行社业务经营许可证》到期之日前的三个月内,持许可证到原颁证机关(国家旅游局)换发。 二、《国际旅行社业务经营许可证》在有效期内需要变更许可证载明事项内容的,应当在完成工商部门的变更登记之日起的相关规定期限内,持相关材料和许可证到原颁证机

关申请换发。 三、《国际旅行社业务经营许可证》损坏的,应当在相关规定期限内将损坏《国际旅行社业务经营许可证》正、副本上交颁证机关申请换发。 四、《国际旅行社业务经营许可证》遗失的,应当在遗失之日起的相关规定期限内在当地公开发行的报纸上刊登启事,并提供报纸原件向颁证机关申请换发。 五、《国际旅行社业务经营许可证》涉及变更事项的,各省(自治区、直辖市)旅游局须认真审验相关材料,并在《国际旅行社变更事项备案登记表》内签章。 附件:1、《国际旅行社业务经营许可证》变更事项所需提供材料的具体规定 2、国际旅行社变更事项备案登记表 国家旅游局质量规范与管理司 2008年2月2日附件1: 《国际旅行社业务经营许可证》变更事项 所需提供材料的具体规定

NOI国家集训队论文分类(至2008)(摘抄自C博客)

摘抄自C博客 组合数学 计数与统计 2001 - 符文杰:《Pólya原理及其应用》 2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》 2007 - 周冬:《生成树的计数及其应用》 2008 - 陈瑜希《Pólya计数法的应用》 数位问题 2009 - 高逸涵《数位计数问题解法研究》 2009 - 刘聪《浅谈数位类统计问题》 动态统计 2004 - 薛矛:《解决动态统计问题的两把利刃》 2007 - 余江伟:《如何解决动态统计问题》 博弈 2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》2007 - 王晓珂:《解析一类组合游戏》 2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》 2009 - 方展鹏《浅谈如何解决不平等博弈问题》 2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》 母函数 2009 - 毛杰明《母函数的性质及应用》 拟阵 2007 - 刘雨辰:《对拟阵的初步研究》 线性规划 2007 - 李宇骞:《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》 置换群 2005 - 潘震皓:《置换群快速幂运算研究与探讨》 问答交互 2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》 猜数问题 2003 - 张宁:《猜数问题的研究:<聪明的学生>一题的推广》

2006 - 龙凡:《一类猜数问题的研究》 数据结构 数据结构 2005 - 何林:《数据关系的简化》 2006 - 朱晨光:《基本数据结构在信息学竞赛中的应用》 2007 - 何森:《浅谈数据的合理组织》 2008 - 曹钦翔《数据结构的提炼与压缩》 结构联合 2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》 2005 - 黄刚:《数据结构的联合》 块状链表 2005 - 蒋炎岩:《数据结构的联合——块状链表》 2008 - 苏煜《对块状链表的一点研究》 动态树 2006 - 陈首元:《维护森林连通性——动态树》 2007 - 袁昕颢:《动态树及其应用》 左偏树 2005 - 黄源河:《左偏树的特点及其应用》 跳表 2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》 2009 - 李骥扬《线段跳表——跳表的一个拓展》 SBT 2007 - 陈启峰:《Size Balance Tree》 线段树 2004 - 林涛:《线段树的应用》 单调队列 2006 - 汤泽:《浅析队列在一类单调性问题中的应用》 哈希表 2005 - 李羽修:《Hash函数的设计优化》 2007 - 杨弋:《Hash在信息学竞赛中的一类应用》 Splay 2004 - 杨思雨:《伸展树的基本操作与应用》

01背包问题动态规划详解

动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。 比如01背包问题。 因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。 测试数据: 10,3 3,4 4,5 5,6 c[i][j]数组保存了1,2,3号物品依次选择后的最大价值. 这个最大价值是怎么得来的呢?从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这样,这一排背包容量为 4,5,6,....10的时候,最佳方案都是放4.假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为4.而背包容量为5的时候,则最佳方案为自己的重量5.背包容量为7的时候,很显然是5加上一个值了。加谁??很显然是7-4=3的时候.上一排c3的最佳方案是4.所以。 总的最佳方案是5+4为9.这样.一排一排推下去。最右下放的数据就是最大的价值了。(注意第3排的背包容量为7的时候,最佳方案不是本身的6.而是上一排的9.说明这时候3号物品没有被选.选的是1,2号物品.所以得9.) 从以上最大价值的构造过程中可以看出。 f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}这就是书本上写的动态规划方程.这回清楚了吗?

下面是实际程序: #include int c[10][100]; int knapsack(int m,int n) { int i,j,w[10],p[10]; for(i=1;ic[i-1][j]) c[i][j]=p[i]+c[i-1][j-w[i]]; else c[i][j]=c[i-1][j]; }

国家集训队2001论文集 毛子青

动态规划算法的优化技巧 福州第三中学毛子青 [关键词] 动态规划、时间复杂度、优化、状态 [摘要] 动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。 [正文] 一、引言 动态规划是一种重要的程序设计方法,在信息学竞赛中具有广泛的应用。 使用动态规划方法解题,对于不少问题具有空间耗费大、时间效率高的特点,因此人们在研究动态规划解题时更多的注意空间复杂度的优化,运用各种技巧将空间需求控制在软硬件可以承受的范围之内。但是,也有一部分问题在使用动态规划思想解题时,时间效率并不能满足要求,而且算法仍然存在优化的余地,这时,就需要考虑时间效率的优化。 本文讨论的是在确定使用动态规划思想解题的情况下,对原有的动态规划解法的优化,以求降低算法的时间复杂度,使其能够适用于更大的规模。 二、动态规划时间复杂度的分析 使用动态规划方法解题,对于不少问题之所以具有较高的时间效率,关键在于它减少了“冗余”。所谓“冗余”,就是指不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。动态规划在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少了冗余。 但是,动态规划求解问题时,仍然存在冗余。它主要包括:求解无用的子问题,对结果无意义的引用等等。 下面给出动态规划时间复杂度的决定因素: 时间复杂度=状态总数*每个状态转移的状态数*每次状态转移的时间[1] 下文就将分别讨论对这三个因素的优化。这里需要指出的是:这三者之间不是相互独立的,而是相互联系,矛盾而统一的。有时,实现了某个因素的优化,另外两个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。因此,这就要求我们在优化时,坚持“全局观”,实现三者的平衡。 三、动态规划时间效率的优化 3.1 减少状态总数 我们知道,动态规划的求解过程实际上就是计算所有状态值的过程,因此状态的规模直接影响到算法的时间效率。所以,减少状态总数是动态规划优化的重要部分,本节将讨论减少状态总数的一些方法。

国家旅游局关于印发《导游IC卡发放管理办法(试行)》的通知

国家旅游局关于印发《导游IC卡发放管理办法(试行)》的通 知 【法规类别】旅游服务机构导游人员管理 【发文字号】旅办发[2010]198号 【修改依据】国家旅游局办公室关于修订《导游IC卡发放管理办法(试行)》等事项的通知 【发布部门】国家旅游局 【发布日期】2010.12.28 【实施日期】2010.12.28 【时效性】已被修改 【效力级别】部门规范性文件 国家旅游局关于印发《导游IC卡发放管理办法(试行)》的通知 (旅办发(2010)198号) 各省、自治区、直辖市旅游局(委): 为规范和加强导游IC卡发放管理工作,健全导游IC卡使用管理制度,现将《导游IC卡发放管理办法(试行)》,印发给你们,并就有关事项通知如下: 一、自2011年1月1日起,由各省、自治区、直辖市和新疆生产建设兵团旅游局(委)(以下简称“省级旅游局”)负责本地区(系统)导游IC卡的制作、颁发和监督检查工作;原有A版制版系统城市不再发放和制作导游IC卡,继续承担IC卡年审职责,系统

保留年审功能;原有B版系统的城市职责和系统功能不变。 二、请各省级旅游局通知并督促使用A版系统城市旅游局立即停止制作发放IC卡,协调配合系统开发维护单位完成对系统软硬件的调整和剩余导游IC卡的清理回收工作,于2010年12月31日前将清理情况书面报告我局。 三、自本通知发出之日起,我局只向各省级旅游局发放导游IC卡,请各省级旅游局在开展导游IC卡系统调整和IC卡清理回收工作的同时,研究制订相关管理办法,与清理工作一并报我局备案。 四、换卡、补卡收取成本费的标准为30元/张(含卡、卡套和加工制作、邮寄等全部费用),汇付账户和具体方式另行通知。 五、我局将对各省导游IC卡发放管理工作进行不定期抽查和调研工作。 《导游IC卡发放管理办法(试行)》和此通知执行中有重要情况和意见,请及时报告我局。 特此通知。 联系人:卓超美 联系电话:(010)65201338 国家旅游局办公室 二O一O年十二月二十八日 导游IC卡发放管理办法(试行) 第一条依据《导游人员管理条例》,为规范导游IC卡的发放管理,制定本办法。

国家集训队2005论文集 黄源河

左偏树的特点及其应用 广东省中山市第一中学黄源河 【摘要】 本文较详细地介绍了左偏树的特点以及它的各种操作。 第一部分提出可并堆的概念,指出二叉堆的不足,并引出左偏树。第二部分主要介绍了左偏树的定义和性质。第三部分详细地介绍了左偏树的各种操作,并给出时间复杂度分析。第四部分通过一道例题,说明左偏树在当今信息学竞赛中的应用。第五部分对各种可并堆作了一番比较。最后总结出左偏树的特点以及应用前景。 【关键字】左偏树可并堆优先队列 【目录】 一、引言 (2) 二、左偏树的定义和性质 (2) 2.1 优先队列,可并堆 (2) 2.1.1 优先队列的定义 (2) 2.1.2 可并堆的定义 (2) 2.2 左偏树的定义 (3) 2.3 左偏树的性质 (4) 三、左偏树的操作 (5) 3.1 左偏树的合并 (5) 3.2 插入新节点 (7) 3.3 删除最小节点 (8) 3.4 左偏树的构建 (8) 3.5 删除任意已知节点 (9) 3.6 小结 (12) 四、左偏树的应用 (13) 4.1 例——数字序列(Baltic 2004) (13) 五、左偏树与各种可并堆的比较 (15) 5.1 左偏树的变种——斜堆 (15) 5.2 左偏树与二叉堆的比较 (16) 5.3 左偏树与其他可并堆的比较 (16) 六、总结 (18)

【正文】 一、引言 优先队列在信息学竞赛中十分常见,在统计问题、最值问题、模拟问题和贪心问题等等类型的题目中,优先队列都有着广泛的应用。二叉堆是一种常用的优先队列,它编程简单,效率高,但如果问题需要对两个优先队列进行合并,二叉堆的效率就无法令人满意了。本文介绍的左偏树,可以很好地解决这类问题。 二、左偏树的定义和性质 在介绍左偏树之前,我们先来明确一下优先队列和可并堆的概念。 2.1优先队列,可并堆 2.1.1优先队列的定义 优先队列(Priority Queue)是一种抽象数据类型(ADT),它是一种容器,里面有一些元素,这些元素也称为队列中的节点(node)。优先队列的节点至少要包含一种性质:有序性,也就是说任意两个节点可以比较大小。为了具体起见我们假设这些节点中都包含一个键值(key),节点的大小通过比较它们的键值而定。优先队列有三个基本的操作:插入节点(Insert),取得最小节点(Minimum) 和删除最小节点(Delete-Min)。 2.1.2可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作: H ← Merge(H1,H2) Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。 前面已经说过,如果我们不需要合并操作,则二叉堆是理想的选择。可惜合并二叉堆的时间复杂度为O(n),用它来实现可并堆,则合并操作必然成为算法的瓶颈。左偏树(Leftist Tree)、二项堆(Binomial Heap) 和Fibonacci堆(Fibonacci Heap) 都是十分优秀的可并堆。本文讨论的是左偏树,在后面我们将看到各种可并堆的比较。

动态规划之01背包问题(最易理解的讲解)

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。 01背包的状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为j 的背包中,可以取得的最大价值。 Pi表示第i件物品的价值。 决策:为了背包中物品总价值最大化,第i件物品应该放入背包中吗? 题目描述: 有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最 首先要明确这张表是从右到左,至底向上生成的。 为了叙述方便,用e10单元格表示e行10列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为10的背包,那么这个背包的最大价值是6,因为e物品的重量是4,背包装的了,把e装进去后价值为6。然后是e9单元格表示背包承重9,只有物品e, e装进去后,背包价值为6,接着是e8, e7单元格,一直到e3单元格表示背包承重3,但物品e承重4,装不了,所以e3=0, 对于d10单元格,表示只有物品e,d时,承重为10的背包,所能装入的最大价值,是10,因为物品e,d这个背包都能装进去。对于承重为9的背包,d9=10,是怎么得出的呢? 根据01背包的状态转换方程,需要考察两个值, 一个是f[i-1,j],对于这个例子来说就是e9的值6,另一个是f[i-1,j-Wi]+Pi; 在这里, f[i-1,j]表示我有一个承重为9的背包,当只有物品e可选时,这个背包能装入的最大价值 f[i-1,j-Wi]表示我有一个承重为4的背包(等于当前背包承重减去物品d的重量),当只有物品e可选时,这个背包能装入的最大价值 f[i-1,j-Wi]就是指单元格e4值为6,Pi指的是d物品的价值,即4 由于f[i-1,j-Wi]+Pi = 6 + 4 = 10 大于f[i-1,j] = 6,所以物品d应该放入承重为9的背包,所以d9=10.

国家旅游局公告2006年第1号——欠缴质保金的旅行社名单

国家旅游局公告2006年第1号——欠缴质保金的旅行社名单 【法规类别】旅游服务机构导游人员管理 【发文字号】国家旅游局公告2006年第1号 【发布部门】国家旅游局 【发布日期】2006.01.04 【实施日期】2006.01.04 【时效性】现行有效 【效力级别】XE0303 国家旅游局公告 (2006年第1号) 根据我局《关于进一步做好旅行社质量保证金回收工作的通知》([2005]105号)的要求,各地旅行社补缴质量保证金的工作基本结束。目前,全国仍有74家旅行社未能按时补齐质保金,其中组团社有16家,国际社有58家。现将74家旅行社的名单公示如下。请上述旅行社在2006年2月28日前补齐质保金,逾期将按有关规定给予降类或注销处理。 特此公告。 附:欠缴质保金的旅行社名单 国家旅游局

二00六年一月四日 附: 一、组团社名称及许可证编号(16家) 1 珠海经济特区环球国际旅行社L-GD-GJ00024 2 台山中国旅行社L-GD-GJ00139 3 湛江市旅游总公司L-GD-GJ00017 4 黑龙江省中国青年旅行社L-HLJ-GJ00009 5 伊春中国国际旅行社L-HLJ-GJ00011 6 海南港澳国际旅行社有限公司L-HAN-GJ00006 7 包头中国国际旅行社L-NMG-GJ00008 8 喀什国际旅行社有限责任公司L-XJ-GJ00006 9 开封中国国际旅行社L-HEN-GJ00006 10 广西玉林国际旅行社有限公司L-GX-GJ00024 11 北海中国国际旅行社有限公司L-GX-GJ00005 12 青海省中国青年旅行社有限责任公司L-QH-GJ00003 13 甘肃海外旅游总公司L-GS-GJ0

算法分析与程序设计动态规划及回溯法解背包问题

动态规划法、回溯法解0-1背包问题 2012级计科庞佳奇 一、问题描述与分析 1.动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会 有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。 不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。 多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法。任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。1.最优化原理(最优子结构性质)最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。2.无后效性将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。3.子问题的重叠性动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。求出获得最大价值的方案。 2.回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目 标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。

国家旅游局32号令

国家旅游局32号令:《旅游投诉处理办法》自2010年7月1日起施行2010-5-19 15:12:43国家旅游局政策法规司字号:[大中小]选择背景色: 国家旅游局令 第32号 《旅游投诉处理办法》已经2010年1月4日国家旅游局第1次局长办公会议审议通过。现予公布,自2010年7月1日起施行。 国家旅游局局长:邵琪伟 二○一○年五月五日 旅游投诉处理办法 第一章总则 第一条为了维护旅游者和旅游经营者的合法权益,依法公正处理旅游投诉,依据《中华人民共和国消费者权益保护法》、《旅行社条例》、《导游人员管理条例》和《中国公民出国旅游管理办法》等法律、法规,制定本办法。 第二条本办法所称旅游投诉,是指旅游者认为旅游经营者损害其合法权益,请求旅游行政管理部门、旅游质量监督管理机构或者旅游执法机构(以下统称“旅游投诉处理机构”),对双方发生的民事争议进行处理的行为。 第三条旅游投诉处理机构应当在其职责范围内处理旅游投诉。 地方各级旅游行政主管部门应当在本级人民政府的领导下,建立、健全相关行政管理部门共同处理旅游投诉的工作机制。 第四条旅游投诉处理机构在处理旅游投诉中,发现被投诉人或者其从业人员有违法或犯罪行为的,应当按照法律、法规和规章的规定,作出行政处罚、向有关行政管理部门提出行政处罚建议或者移送司法机关。 第二章管辖 第五条旅游投诉由旅游合同签订地或者被投诉人所在地县级以上地方旅游投诉处理机构管辖。 需要立即制止、纠正被投诉人的损害行为的,应当由损害行为发生地旅游投诉处理机构管辖。 第六条上级旅游投诉处理机构有权处理下级旅游投诉处理机构管辖的投诉案件。 第七条发生管辖争议的,旅游投诉处理机构可以协商确定,或者报请共同的上级旅游投诉处理机构指定管辖。 第三章受理

历年国家集训队论文题目

1999年 陈宏- 数据结构的选择与算法效率——从IOI98试题PICTURE谈起 来煜坤- 把握本质,灵活运用——动态规划的深入探讨 齐鑫- 搜索方法中的剪枝优化 邵铮- 数学模型的建立、比较和应用 石润婷- 隐蔽化、多维化、开放化──论当今信息学竞赛中数学建模的灵活性睢》?- 准确性、全面性、美观性——测试数据设计中的三要素 周咏基- 论随机化算法的原理与设计 2000年 陈彧- 信息学竞赛中的思维方法 方奇- 动态规划 高寒蕊- 递推关系的建立及在信息学竞赛中的应用 郭一- 数学模型及其在信息学竞赛中的应用 江鹏- 探索构造法解题模式 李刚- 动态规划的深入讨论 龙翀- 解决空间规模问题的几种常用的存储结构 骆骥- 数学模型的建立和选择 施遥- 人工智能在围棋程序中的应用 肖洲- 数据结构的在程序设计中的应用 谢婧- 规模化问题的解题策略 徐串- 论程序的调试技巧 徐静- 图论模型的建立与转化 杨江明- 论数学策略在信息学问题中的应用 杨培- 非最优化算法初探 张辰- 动态规划的特点及其应用 张力- 类比思想在解题中的应用 张一飞- 冗繁削尽留清瘦——浅谈信息的充分利用 2001年 高寒蕊- 从圆桌问题谈数据结构的综合运用 符文杰- Pólya原理及其应用 高岳- 中等硬度解题报告 江鹏- 从一道题目的解法试谈网络流的构造与算法 刘汝佳- 搬运工问题的启示 李益明- 计算几何的相关问题 李源- 树的枚举 骆骥- 由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性毛子青- 动态规划算法的优化技巧 俞玮- 基本动态规划问题的扩展 张一飞- 求N!的高精度算法 2002年 戴德承- 退一步海阔天空——“目标转化思想”的若干应用

解0-1背包问题的动态规划算法

关于求解0/1背包问题的动态规划算法 摘要:本文通过研究动态规划原理,提出了根据该原理解决0/1背包问题的方法与算法实现, 并对算法的正确性作了验证.观察程序运行结果,发现基于动态规划的算法能够得到正确的决策方案且比穷举法有效. 关键字:动态规划;0/1背包;约束条件;序偶;决策序列;支配规则 1、引 言 科学研究与工程实践中,常常会遇到许多优化问题,而有这么一类问题,它们的活动过程可以分为若干个阶段,但整个过程受到某一条件的限制。这若干个阶段的不同决策的组合就构成一个完整的决策。0/1背包问题就是一个典型的在资源有限的条件下,追求总的收益最大的资源有效分配的优化问题。 对于0/1背包问题,我们可以这样描述:设有一确定容量为C 的包及两个向量C ’=(S 1,S 2,……,S n )和P=(P 1,P 2,……,P N ),再设X 为一整数集合,即X=1,2,3,……,N ,X 为SI 、PI 的下标集,T 为X 的子集,那么问题就是找出满足约束条件∑S i 〈=C ,使∑PI 获得最大的子集T 。在实际运用中,S 的元素可以是N 个经营项目各自所消耗的资源,C 可以是所能提供的资源总量,P 的元素可是人们从各项项目中得到的利润。 0/1背包问题是工程问题的典型概括,怎么样高效求出最优决策,是人们关心的问题。 2、求解问题的动态规划原理与算法 2.1动态规划原理的描述 求解问题的动态规划有向前处理法向后处理法两种,这里使用向前处理法求解0/1背包问题。对于0/1背包问题,可以通过作出变量X 1,X 2,……,X N 的一个决策序列来得到它的解。而对于变量X 的决策就是决定它是取0值还是取1值。假定决策这些X 的次序为X n ,X N-1,……,X 0。在对X 0做出决策之后,问题处于下列两种状态之一:包的剩余容量是M ,没任何效益;剩余容量是M-w ,效益值增长了P 。显然,之后对X n-1,Xn-2,……,X 1的决策相对于决策X 所产生的问题状态应该是最优的,否则X n ,……,X 1就不可能是最优决策序列。如果设F j (X )是KNAP (1,j ,X )最优解的值,那么F n (M )就可表示为 F N (M )=max(f n (M),f n-1(M-w n )+p n )} (1) 对于任意的f i (X),这里i>0,则有 f i (X)=max{f i-1(X),f i-1(X-w i )+p i } (2) 为了能由前向后推而最后求解出F N (M ),需从F 0(X )开始。对于所有的X>=0,有F 0(X )=0,当X<0时,有F 0(X )等于负无穷。根据(2),可求出0〈X 〈W 1和X 〉=W 1情况下F 1(X )的值。接着由(2)不断求出F 2,F 3,……,F N 在X 相应取值范围内的值。 2.2 0/1背包问题算法的抽象描述 (1)初始化各个元素的重量W[i]、效益值P[i]、包的最大容量M ; (2)初始化S0; (3)生成S i ;

国家旅游局关于放宽旅行社设立服务网点政策有关事项的通知

国家旅游局关于放宽旅行社设立服务网点政策有关事项的通知 (旅发〔2015〕211号) 各省、自治区、直辖市旅游委、局,新疆生产建设兵团旅游局: 为贯彻落实《关于促进旅游业改革发展的若干意见》(国发〔2014〕31号)精神,现就放宽旅行社设立服务网点政策有关事项通知如下: 一、放宽设立服务网点区域范围 允许设立社在所在地的省(市、区)行政区划内及其分社所在地的设区的市的行政区划内设立服务网点,不受数量限制。 在设立社所在地的省(市、区)行政区划内设立服务网点的,设立社向服务网点所在地工商行政管理部门办理服务网点设立登记后,应当在3个工作日内,持设立社营业执照副本、设立社旅行社业务经营许可证副本、服务网点的营业执照、服务网点经理的履历表和身份证明向服务网点所在地与工商登记同级的旅游主管部门备案。 旅行社在其分社所在地的设区的市的行政区划内设立服务网点的,设立社向服务网点所在地工商行政管理部门办理服务网点设立登记后,应当在3个工作日内,持设立社营业执照副本、设立社旅行社业务经营许可证副本、分社的营业执照、旅行社分社备案登记证明、服务网点的营业执照、服务网点经理的履历表和身份证明向服务网点所在地与工商登记同级的旅游主管部门备案。 二、落实分社和服务网点设立政策 各地要认真学习贯彻《国务院关于促进旅游业改革发展的若干意见》(国发〔2014〕31号),切实按照《旅行社条例》及本通知要求,依法依规做好分社和服务网点的备案工作,不得增设或变相增设旅行社设立分社、服务网点的政策障碍。

各省级旅游主管部门要积极开展针对市、县级旅游主管部门的培训指导和监督检查,发现不依法依规开展分社和服务网点备案工作的,要及时予以纠正。 三、加强对旅行社分社和服务网点的服务监管 各地要进一步引导旅行社增强风险管控意识,审慎确定分支机构设立的数量和规模;督促设立社切实加强对分社和服务网点的管理和人员培训,依法承担经营活动的责任和后果;要加强旅游质监执法人员的培训,建立健全对旅行社分社、服务网点的事中事后监管机制,改进服务监管手段,提升服务监管水平,对发现的违法违规行为,要主动协同设立社所在地旅游主管部门进行依法查处。 国家旅游局此前发布的相关规定与本通知不一致的,依照本通知执行。 国家旅游局 2015年9月22日

01背包问题动态规划详解及C++代码

0/1背包问题动态规划详解及C++代码 1. 问题描述 给定一个载重量为C的背包 有n个物品 其重量为wi 价值为vi 1<=i<=n 要求:把物品装入背包 并使包内物品价值最大2. 问题分析 在0/1背包问题中 物体或者被装入背包 或者不被装入背包 只有两种选择。循环变量i j意义 前i个物品能够装入载重量为j的背包中 数组c意义 c[i][j]表示前i个物品能装入载重量为j的背包中物品的最大价值 若w[i]>j 第i个物品不装入背包 否则 若w[i]<=j且第i个物品装入背包后的价值>c[i-1][j] 则记录当前最大价值 替换为第i个物品装入背包后的价值 其c++代码如下 #include using namespace std; void KANPSACK_DP(int c[50][50], int w[50], int v[50], int n, int C) { for(int i = 0; i <= C; i ++) { c[0][i] = 0; } for(int i = 1; i <= n; i ++) { c[i][0] = 0; for(int j = 1; j <= C; j ++) { if(w[i] <= j) { if(v[i] + c[i - 1][j - w[i]] > c[i - 1][j]) c[i][j] = v[i] + c[i - 1][j - w[i]]; else c[i][j] = c[i - 1][j]; } else c[i][j] = c[i - 1][j]; } } } void OUTPUT_SACK(int c[50][50], int x[50], int w[50], int n, int C) { for(int k = n; k >= 2; k --) { if(c[k][C] == c[k-1][C]) x[k] = 0; else { x[k] = 1; C = C - w[k];

NOI国家集训队论文分类(至2008)(摘抄自C博客)

NOI国家集训队论文分类(至2008) 摘抄自C博客 组合数学 计数与统计 2001 - 符文杰:《Polya原理及其应用》 2003 -许智磊:《浅谈补集转化思想在统计问题中的应用》 2007 -周冬:《生成树的计数及其应用》 2008 - 陈瑜希《Polya计数法的应用》 数位问题 2009 -高逸涵《数位计数问题解法研究》 2009 -刘聪《浅谈数位类统计问题》 动态统计 2004 -薛矛:《解决动态统计问题的两把利刃》 2007 -余江伟:《如何解决动态统计问题》 博弈 2002 -张一飞:《由感性认识到理性认识一一透析一类搏弈游戏的解答过程》2007 -王晓珂:《解析一类组合游戏》 2009 -曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》 2009 -方展鹏《浅谈如何解决不平等博弈问题》 2009 -贾志豪《组合游戏略述一一浅谈SG游戏的若干拓展及变形》母函数 2009 -毛杰明《母函数的性质及应用》 拟阵 2007 -刘雨辰:《对拟阵的初步研究》 线性规划 2007 -李宇骞:《浅谈信息学竞赛中的线性规划一一简洁高效的单纯形法实现与应用》 置换群 2005 -潘震皓:《置换群快速幕运算研究与探讨》 问答交互 2003 -高正宇:《答案只有一个一一浅谈问答式交互问题》 猜数问题 2003 -张宁:《猜数问题的研究:< 聪明的学生> 一题的推广》

2006 -龙凡:《一类猜数问题的研究》 数据结构 数据结构 2005 -何林:《数据关系的简化》 2006 -朱辰光:《基本数据结构在信息学竞赛中的应 用》 2007 -何森:《浅谈数据的合理组织》 2008 -曹钦翔《数据结构的提炼与压缩》 结构联合 2001 -高寒蕊:《从圆桌问题谈数据结构的综合运用》 2005 -黄刚:《数据结构的联合》 块状链表 2005 -蒋炎岩:《数据结构的联合——块状链表》 2008 -苏煜《对块状链表的一点研究》 动态树 2006 -陈首元:《维护森林连通性——动态树》 2007 -袁昕颢:《动态树及其应用》 左偏树 2005 -黄源河:《左偏树的特点及其应用》 跳表 2005 -魏冉:《让算法的效率跳起来”——浅谈跳跃表”的相关操作及其应用》2009 -李骥扬《线段跳表——跳表的一个拓展》 SBT 2007 - 陈启峰:《Size Bala nee Tree 》 线段树 2004 -林涛:《线段树的应用》 单调队列 2006 -汤泽:《浅析队列在一类单调性问题中的应用》 哈希表 2005 - 李羽修:《Hash函数的设计优化》 2007 - 杨弋:《Hash在信息学竞赛中的一类应用》 Splay 2004 -杨思雨:《伸展树的基本操作与应用》

0-1背包问题动态规划详解及代码

0/1 背包问题动态规划详解及C代码 动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。 问题描述: 给定N中物品和一个背包。物品i的重量是W i,其价值位V i,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i 装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。 问题分析:令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) jw i (1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-w i的背包中的价值加上第i个物品的价值v i; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。 比如01背包问题。 因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。测试数据: 10,3 3,4 4,5 5,6

国家集训队2005论文集 潘震皓

置换群快速幂运算 研究与探讨 江苏省苏州中学 潘震皓 [关键词] 置换 循环 分裂 合并 [摘要] 群是一个古老的数学分支,近几年来在程序设计中置换群得到了一定的应用。本文针对置换群的特点提出了线性时间的幂运算算法,并举例说明了优化后算法的效果。 [正文] 一、引言 置换群是一种优秀的结构,在程序设计中,它的大部分基本操作,时间和空间复杂度都是线性的,甚至有的还是常数的。所以一个问题如果能够抽象归结为一个置换群模型的话,往往能够在程序设计中轻松地解决。但是对于整幂运算来说,似乎只能通过反复做乘法来获得O(k*乘法)或是O(logk*乘法)的算法;而对于分数幂运算,则找不到较好的方法实现。 二、置换群的整幂运算 2.1 整幂运算的一个转化 在置换群中有一个定理:设e T k =, (T 为一置换,e 为单位置换(映射函数为x x f =)(的置换)),那么k 的最小正整数解是T 的拆分的所有循环长度的最小公倍数。 或者有个更一般的结论:设e T k =, (T 为一循环,e 为单位置换),那么k 的最小正整数解为T 的长度。 我们知道,单位置换就是若干个只含单个元素的循环.........的并。也就是说,长度为l 的循环,l 次的幂,把所有元素都完全分裂了。这是为什么呢? 我们来做一个试验:(下面的置换均以循环的连接表示) 设n=6,那么3 26 )(T T =。任取一T=(1 3 5 2 4 6),来做一遍乘法: ()() 36 2 45 1 34 126565432134 1 2 6 51265431265436543211265436543211265436543212 =???? ??=???? ?????? ??=???? ?????? ??=T 分裂成了2份!而且这2份恰好是T 的奇数项和偶数项!(注意可以写成(1 5 4)(3 2 6))

0-1背包问题动态规划详解及代码

0/1背包问题动态规划详解及C代码 动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。 比如01背包问题。 /*一个旅行者有一个最多能用M公斤的背包,现在有N件物品, 它们的重量分别是W1,W2,...,Wn, 它们的价值分别为P1,P2,...,Pn. 若每种物品只有一件求旅行者能获得最大总价值。 输入格式: M,N W1,P1 W2,P2 ...... 输出格式: X*/ 因为背包最大容量M未知。所以,我们的程序要从1到M一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。 测试数据: 10,3 3,4

4,5 5,6 c[i][j]数组保存了1,2,3号物品依次选择后的最大价值. 这个最大价值是怎么得来的呢?从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放 4."这样,这一排背包容量为4,5,6,....10的时候,最佳方案都是放 4."假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为 4."而背包容量为5的时候,则最佳方案为自己的重量 5."背包容量为7的时候,很显然是5加上一个值了。加谁??很显然是7-4=3的时候.上一排c3的最佳方案是 4."所以。总的最佳方案是5+4为 9."这样.一排推下去。最右下放的数据就是最大的价值了。(注意第3排的背包容量为7的时候,最佳方案不是本身的 6."而是上一排的 9."说明这时候3号物品没有被选.选的是1,2号物品.所以得 9.") 从以上最大价值的构造过程中可以看出。 f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}这就是书本上写的动态规划方程.这回清楚了吗? 下面是实际程序(在VC 6."0环境下通过): #include

相关文档
最新文档