背包问题 实验报告

背包问题 实验报告
背包问题 实验报告

实验报告

课程名称:算法设计与分析实验名称:解0-1背包问题任课教师:王锦彪专业:计算机应用技术班级: 2011 学号: 112015

姓名:严焱心完成日期: 2011年11月

一、实验目的:

掌握动态规划、贪心算法、回溯法、分支限界法的原理,并能够按其原理编程实现解决0-1背包问题,以加深对上述方法的理解。

二、实验内容及要求:

1. 要求分别用动态规划、贪心算法、回溯法和分支限界法求解0-1背包问题; 2. 要求显示结果。

三、实验环境和工具:

操作系统:Windows7 开发工具:Eclipse3.7.1 jdk6 开发语言:Java

四、实验问题描述:

0/1背包问题:现有n 种物品,对1<=i<=n ,第i 种物品的重量为正整数W i ,价值为正整数V i ,背包能承受的最大载重量为正整数C ,现要求找出这n 种物品的一个子集,使得子集中物品的总重量不超过C 且总价值尽量大。

动态规划算法描述:根据问题描述,可以将其转化为如下的约束条件和目标函数:

?????≤≤∈≤∑∑==)1}(1,0{C

max

1

1

n i x x w x v i

n

i i i n

i i

i

寻找一个满足约束条件,并使目标函数式达到最大的解向量

)

,......,,,(321n x x x x X =,使得C 1

∑=≤n

i i

i x w ,而且∑=n

i i

i x v 1

达到最大。

0-1背包问题具有最优子结构性质。假设),......,,,(321n x x x x 是所给的问题的一个最优解,则),......,,(32n x x x 是下面问题的一个最优解:

∑∑==?????≤≤∈-≤n

i i i i

n

i i i x v n i x x w x w 2

2

1

1max )2}(1,0{C 。

如果不是的话,设)

,......,,(32

n y y y 是这个问题的一个最优解,则∑∑==>n

i n

i i i i i x v y v 2

2

,且∑=≤+

n

i i

i y w x w 2

1

1C

因此,∑∑∑====

+

>+n

i i

i n i n

i i

i

i

i x v x

v x v y v x v 1

2

2

1111,

这说明)

,........,,,(32

1

n y y y x 是所给

的0-1背包问题比),........,,,(321n x x x x 更优的解,从而与假设矛盾。

按照上面的情况,可以得到递推公式:设最优值为m(i,j)。

??

?+-+++=}),1(),,1(max{)

,1(),(i i v w j i m j i m j i m j i m i

i

w w ≥<≤j j 0

??

?=n v j n m 0),(i

i

w w ≥<≤j j 0

贪心算法描述:计算每种物品单位重量的价值;将尽可能多的单位重量价值最高的物品装入背包;如果单位重量价值最高的物品全部装入背包后,背包的总重量小于c ,则选择单位重量次高的物品并尽可能多的装入背包;依次进行下去,直到背包装满为止。

回溯算法描述:回溯法从根结点出发,以深度优先的方式搜索整个解空间。开始结点成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩

展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时往回移动至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。针对所给问题,定义问题的解空间;确定易于搜索的解空间结构;以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。

分支限界算法描述:分支限界法以广度优先的方式搜索问题的解空间树,每一个活结点只有一次机会成为扩展节点。活结点一旦成为扩展节点,就一次性产生其所有儿子节点,那些导致不可行解或导致非最优解的儿子节点被舍去,其余儿子节点被加入到活结点表中。此后,从活结点表中取下一节点成为当前扩展节点,并重复上述节点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

五、实验原理、结果与结论:

1.1、动态规划求解0-1背包问题

实验结果:

实验原理:动态规划方法建立在最优原则的基础上,以空间换取时间,将一个问题的解决方案视为一系列决策的结果。在动态规划中,还要看每个最优决策序列中是否包含一个最优子序列。即无论过程的初始状态和初始决策是什么,其余的决策必须相对于初始决策所产生的状态构成一个最优决策。如果把第i个物品装入背包,则背包中物

品的价值就等于把前i-1个物品装入容量为i w j -的背包中的价值加上第i 个物品的价值i v ;如果第i 个物品没有装入背包,则背包中物品的价值就是等于把前i-1个物品装入容量为j 的背包中所取得的价值。取二者中价值较大者作为把前i 个物品装入容量为j 的背包中的最优解。

2.1、贪心算法求解背包问题: 实验结果:

实验原理:贪心算法也要求问题具有最有子结构性质。0-1背包问题不能用贪心算法来求解。在选择物品)1(n i i ≤≤装入背包时,可以选择一部分,而不一定要全部装入背包。贪心法得不到最优解,无法保证最终能将背包装满,部分闲置的背包容量使背包单位重量的价值降低了。

3.1、回溯法求解背包问题: 实验结果:

实验原理:用回溯法解0-1背包问题时,用到状态空间树。在搜索状态空间树时,只要其左儿子结点是一个可行结点,搜索就进入其左子树。当右子树有可能包含最优解时才进入右子树搜索,否则将右子树剪去。计算右子树中解的上界将剩余物品依其单位重量价值排序,

然后依次装入物品,直至装不下时,再装入该物品的一部分而装满背包。由此得到的价值是右子树中解的上界,用此值来剪枝。在搜索状态空间树时,由函数Backtrack控制。在函数中是利用递归调用的方法实现了空间树的搜索。

4.1、分支界限法求解背包问题:

实验结果:

实验原理:在类Knap中有四个函数:上界函数Bound(),计算节点所对应价值的上界;函数AddLiveNode()是将一个新的活结点插入到子集树和优先队列中;KnapsackF()实施对子集树的优先队列式分支界限搜索。其中假定物品依其单位价值从大到小已经排好序。cw 是该结点的重量;cp是该结点的价值;up是价值上界。算法的while 循环不断扩展结点,直到子集树的一个叶结点成为扩展结点为止。此时优先队列中所有活结点的价值上界均不超过该叶结点的价值。因此该叶结点相应的解为问题的最优解。在while循环内部,算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。

六、时空效率分析:

动态规划法:由于函数Knapsack中有一个两重for循环,所以时间复杂度为O[nc]。空间复复杂度也是O[nc],即O(nc)。而

Traceback需要O(n)。

贪心算法:算法的时间上界O(nlogn)。

回溯法:上界函数Bound需要O(n)时间,在最坏情况下有)

O个

2(n

右儿子结点需要计算上界,所以解0-1背包问题的回溯算法所需要的

计算时间为)

O。

n

(n

2

分支限界法:计算上界的函数Bound需要O(n)的时间,而且在最

坏情况下有)

O个结点需要计算上界,所以在最坏情况下的时间复2(n

杂度为)

O。

n

2

(n

四种算法比较:

从计算复杂性理论看,背包问题是NP完全问题。回溯法和分枝限界法等可以得到问题的最优解,可是计算时间太慢;动态规划法也可

以得到最优解,当n

时,算法需要)2

m2

(n

O的计算时间,计算速度

n

慢;采用贪心算法,不一定是最优解。以上几种方法中回溯法、动态规划法、贪心法都广泛地应用到不同的实际问题中,并在应用中不断地改进。

七、实验总结:

在做本次实验之前,自己对动态规划、贪心、回溯法、分支限界法的原理不是非常的理解,花了很多时间看了课本上的相关内容。不过那是C++代码,有些封装好的方法在Java里好像没能找到对应的方法,所以只能自己编写同功能的对应方法。同时课本所提供的代码也是不能直接翻译过来用,当你懂得算法的基本原理后,你会发现数组下标会出错,课本所提供的代码数组下标一般都是从1开始,而我们输入的数据数组下标默认都是从0开始,所以在参考课本所提供的代码的同时,必须结合算法的实际情况对代码中的相关变量进行修改,这样才能充分利用课本所提供的代码完成本次实验。通过本次试验,自己基本上掌握上述算法解0-1背包问题的原理,达到实验的目的。

01背包问题不同算法设计、分析与对比报告

实验三01背包问题不同算法设计、分析与对比一.问题描述 给定n种物品和一背包。物品i的重量是w i ,其价值为v i ,背包的容量为c。 问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。 说明:在选择装入背包的物品时,对每种物品i只有两个选择,装入背包或不装入背包,也不能将物品装入背包多次。 二.实验内容与要求 实验内容: 1.分析该问题适合采用哪些算法求解(包括近似解)。 ^ 动态规划、贪心、回溯和分支限界算法。 2.分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分析。 动态规划: 递推方程: m(i,j) = max{m(i-1,j),m(i-1,j-wi)+vi} j >= wi; m(i-1,j) j < wi; 时间复杂度为O(n). 贪心法: ^ 算法思想:贪心原则为单位价值最大且重量最小,不超过背包最大承重量为约束条件。也就是说,存在单位重量价值相等的两个包,则选取重量较小的那个背包。但是,贪心法当在只有在解决物品可以分割的背包问题时是正确的。贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中, 直到把所有数据枚举完,或者不能再添加为止。 回溯法:

回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。这种具有限界函数的深度优先生成法称为回溯法。 对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。 时间复杂度为:O(2n) 空间复杂度为:O(n) : 分支限界算法: 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。在优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。 算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。 3.设计并实现所设计的算法。 4.对比不同算法求解该问题的优劣。 这动态规划算法和贪心算法是用来分别解决不同类型的背包问题的,当一件背包物品可以分割的时候,使用贪心算法,按物品的单位体积的价值排序,从大到小取即可。当一件背包物品不可分割的时候,(因为不可分割,所以就算按物品的单位体积的价值大的先取也不一定是最优解)此时使用贪心是不对的,应使用动态规划。 5.需要提交不同算法的实现代码和总结报告。 动态规划方法: public class Knapsack {

信息安全加密实验报告

重庆交通大学实验报告 班级:计信专业2012级2班 学号: 631206060232 姓名:娄丽梅 实验项目名称:DES加解密程序设计与实现 实验项目性质:设计性(验证性) 实验所属课程:信息安全 实验室(中心):软件实验室 指导教师:米波 实验完成时间: 2014 年12月11日

一、实验目的 1、理解DES加密与解密的程序设计算法思想。 2、编写DES加密与解密程序,实现对明文的加密与解密,加深对数据加密与解密的理解,掌握DES加密算法思想,提高网络安全的编程能力。 二、实验主要内容及原理 (一)实验内容 1、掌握DES算法; 2、编写DES算法。 (二)实验原理 1、初始置换 初始置换在第一轮运算之前执行,对输入分组实施如下表所示的变换。此表应从左向右、从上向下读。在将这64位数据分为左右两部分,每部分分别为32位,将左32位留下,将右32位按照下表进行排列 2、密钥置换 一开始,由于不考虑每个字节的第8位,DES的密钥由64位减至56位。每个字节第8位可作为奇偶校验位以确保密钥不发生错误。接着,56位密钥被分成两部分,每部分28位。然后,根据轮数,这两部分分别循环左移l位或2位。在DES的每一轮中,从56位密钥选出48位子密钥(Sub Key)。 3、S盒置换 当产生了48位密钥后就可以和右边32位明文进行异或运算了,得到48位的密文。 再经过下论的S盒跌带,其功能是把6bit数据变为4bit数据,每个S盒是一个4行、16列的表。盒中的每一项都是一个4位的数。S盒的6个位输入确定了其对应的输出在哪一行哪一列。 4、P盒置换 S盒代替运算后的32位输出依照P盒进行置换。该置换把每输入位映射到输出位,任意一位不能被映射两次,也不能被略去,这个置换叫做直接置换。 5、再次异或运算 最后,将P盒置换的结果与最初的64位分组的左半部分异或,然后左、右半部分交换,接着开始另一轮。 6、当进行到16轮后,最终进行一次末置换,形成密文

文件加密与解密实验报告

HUNAN UNIVERSITY 程序设计训练——文件加密与解密 报告 学生姓名X X X 学生学号20110102308 专业班级建环308 指导老师何英 2012-07-01至 2012-07-13

一、程序设计目的和要求 (3) 二、程序设计内容 (4) 1、总体设计 (4) 1.1主控选择模块 (4) 1.2加密模块 (4) 1.3解密模块 (4) 2、流程图 (5) 三模块详细说明 (6) 四、测试数据及其结果 (7) 五、课程设计总结 (8) 六、附录 (9) 附录1:参考文献 (9) 附录2:程序源代码 (9)

一、程序设计目的和要求 1、目的:为保证个人数据资料不被他人窃取使用,保护个人隐私及个人文件。设计一个基于c语言的文本文件加密及解密软件,可以方便对文本文件的加密与解密。本设计实现了文本文件的解密及解密,运行软件之后只需输入任意一个文本文件的文件名及后缀名即可对该文本文件进行加密或解密操作。本设计的加密与解密系统,使用了面向各类文件的方法,运用Microsoft Visual C++ 6.0实现具有加密、解密、帮助信息、读取文本文件、显示结果、退出等功能的文件加密与解密系统。 2、要求: (1)从键盘输入要进行加密的一行字符串或者需要加密的文件名。 (2)显示菜单: (3)选择菜单,进行相应的操作。加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到文件中;解密是将加了密的文件还原并保存到文件中,同时应比较与原始文件的一致性; 3、其他要求 (1)变量、函数命名符合规范。 (2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

动态规划之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.

数据加密实验报告

实验报告 课程:计算机保密_ _ 实验名称:数据的加密与解密_ _ 院系(部):计科院_ _ 专业班级:计科11001班_ _ 学号: 201003647_ _ 实验日期: 2013-4-25_ _ 姓名: _刘雄 _ 报告日期: _2013-5-1 _ 报告评分:教师签字:

一. 实验名称 数据加密与解密 二.运行环境 Windows XP系统 IE浏览器 三.实验目的 熟悉加密解密的处理过程,了解基本的加密解密算法。尝试编制基本的加密解密程序。掌握信息认证技术。 四.实验内容及步骤 1、安装运行常用的加解密软件。 2、掌握加解密软件的实际运用。 *3、编写凯撒密码实现、维吉尼亚表加密等置换和替换加解密程序。 4、掌握信息认证的方法及完整性认证。 (1)安装运行常用的加解密软件,掌握加解密软件的实际运用 任务一:通过安装运行加密解密软件(Apocalypso.exe;RSATool.exe;SWriter.exe等(参见:实验一指导))的实际运用,了解并掌握对称密码体系DES、IDEA、AES等算法,及非对称密码体制RSA等算法实施加密加密的原理及技术。 ?DES:加密解密是一种分组加密算法,输入的明文为64位,密钥为56位,生成的密文为64位。 ?BlowFish:算法用来加密64Bit长度的字符串或文件和文件夹加密软件。 ?Gost(Gosudarstvennyi Standard):算法是一种由前苏联设计的类似DES算法的分组密码算法。它是一个64位分组及256位密钥的采用32轮简单迭代型加密算法. ?IDEA:国际数据加密算法:使用128 位密钥提供非常强的安全性; ?Rijndael:是带有可变块长和可变密钥长度的迭代块密码(AES 算法)。块长和密钥长度可以分别指定成128、192 或256 位。 ?MISTY1:它用128位密钥对64位数据进行不确定轮回的加密。文档分为两部分:密钥产生部分和数据随机化部分。 ?Twofish:同Blowfish一样,Twofish使用分组加密机制。它使用任何长度为256比特的单个密钥,对如智能卡的微处理器和嵌入在硬件中运行的软件很有效。它允许使用者调节加密速度,密钥安装时间,和编码大小来平衡性能。 ?Cast-256:AES 算法的一种。 (同学们也可自己下载相应的加解密软件,应用并分析加解密过程) 任务二:下载带MD5验证码的软件(如:https://www.360docs.net/doc/4210418310.html,/downloads/installer/下载(MySQL):Windows (x86, 32-bit), MSI Installer 5.6.11、1.5M;MD5码: 20f788b009a7af437ff4abce8fb3a7d1),使用MD5Verify工具对刚下载的软件生成信息摘要,并与原来的MD5码比较以确定所下载软件的完整性。或用两款不同的MD5软件对同一文件提取信息摘要,而后比较是否一致,由此可进行文件的完整性认证。

AES加密解密实验报告

信息安全工程课程 实验报告 AES加密解密的实现 课程名称:信息安全工程 学生姓名:黄小菲 学生学号: 3112041006 专业班级:系统工程2038班 任课教师:蔡忠闽 2012年11月22日

目录 1.背景 (1) 1.1 Rijndael密码的设计标准: (1) 1.2 设计思想 (1) 2.系统设计 (2) 2.1系统主要目标 (2) 2.2功能模块与系统结构 (2) 2.2.1字节替换SubByte (2) 2.2.2行移位ShiftRow (2) 2.2.3 列混合MixColumn (3) 2.2.4 轮密钥加AddRoundKey (4) 2.2.5 逆字节替换 (4) 2.2.6逆行移位InvShiftRow (4) 2.2.7 逆列混淆 (4) 3 加密模式 (5) 3.1 电子密码本ECB模式 (5) 3.2加密块链模式CBC模式 (6) 4 系统功能程序设计 (8) 4.1基本加密部分 (8) 4.1.1字节替换 (8) 4.1.2行移位 (8) 4.1.3列混合 (9) 4.1.4轮密钥加 (9) 4.1.5密钥扩展 (10) 4.1.6逆字节替换 (11) 4.1.7逆行移位 (11) 4.1.8逆列混合 (12) 4.1.9加密 (12) 4.1.10解密 (13) 5 实验结果 (14) 5.1 需要加密文件 (14) 5.2 实验加密解密结果 (15) 6 参考资料 (16)

1.背景 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。Rijndael算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。 该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于"Rhine doll"。)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。作为一个新的加密标准,目前正被部署应用到更广大的范围. 1.1 Rijndael密码的设计标准: ①抵抗所有已知的攻击。 ②在多个平台上速度快,编码紧凑。 ③设计简单。 当前的大多数分组密码,其轮函数是Feistel结构。 Rijndael没有这种结构。 Rijndael轮函数是由3个不同的可逆均匀变换 1.2 设计思想 ?分组和密钥长度可变,各自可独立指定为128、192、256比特。 ?状态 ?算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵 阵列表示,该阵列有4行,列数N b为分组长度除32 ?种子密钥 ?以字节为元素的矩阵阵列描述,阵列为4行,列数N k为密钥长度除32

算法设计背包问题

算法实验报告 ---背包问题 实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优 值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 问题描述: 给定n种物品和一个背包。物品i的重量是wi,体积是bi,其价值为vi, 背包的容量为c,容积为d。问应如何选择装入背包中的物品,使得装入背包中 物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入 或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,背包的 容积d,物品的个数n。接下来的n行表示n个物品的重量、体积和价值。输出 为最大的总价值。 问题分析: 标准0-1背包问题,MaxV表示前i个物品装入容量为j的背包中时所能产生的最大价值,结构体objec表示每一个可装入物品,其中w表示物品的重量,v表示物品的价值。如果某物品超过了背包的容量,则该物品一定不能放入背包,问题就变成了剩余i-1个物品装入容量为j的背包中所能产生的最大价值;如果该物品能装入背包,问题就变成i-1个物品装入容量为j-objec[i].w的背包所能产生的最大价值加上物品i的价值objec[i].v. 复杂性分析 时间复杂度,最好情况下为0,最坏情况下为:(abc) 源程序 #include #include #include #include #include int V [200][200][200]; int max(int a,int b) {

发送数字签名和加密邮件-实验报告

一、实验目的 ●了解什么是数字签名与加密 ●掌握用Outlook Express发送签名的方法 ●掌握用Outlook Express 发送加密的方法。 二、实验环境 ●实验室所有机器安装了Windows 操作系统,并附带Outlook Express。 三、实验容和步骤 1、设置Outlook Express收发QQ (1)打开OUTLOOK EXSPRESS方法为开始/所有程序/OUTLOOK EXPRESS; (2)申请方法:OUTLOOK EXSPRESS的工具//添加//输入显示名/输入你的QQ地址/设置电子服务器名pop.qq. smtp.qq./输入电子的名称和密码/下一步/完成 2、申请免费数字证书

查看证书: 3、在 Outlook Express 设置数字证书 (1)在 Outlook Express 中,单击“工具”菜单中的“”(2)选取“”选项卡中用于发送安全的,然后单击“属性”。

(3)选取安全选项卡中的签名标识复选框,然后单击选择按健 (4)在弹出的“选择默认数字标识”窗口中,选择要使用的数字证书,就选择你刚才申请的个人电子保护证书 (5)点击“确定”按钮,完成证书设置。至此,你可以发送带数字签名的。 4、发送签名 发送时从“工具”菜单中选择“签名”,收件人地址栏后面出现“签名”标志。

本次实验我给为 qq. 发送一个签名。 发送成功: 5、发送加密 发送加密前必须正确安装了对方的“电子保护证书”,只要请对方用他的“电子保护证书”给你发送一个签名,证书会自动安装,并与对方Email地址绑定,否则就要手工安装对方“电子保护证书”。(1)从Outlook Express“工具”菜单中选择“选项”。 (2)鼠标单击“数字标识”按钮。

DES加密算法实验报告

苏州科技学院 实验报告 学生姓名:杨刘涛学号:1220126117 指导教师:陶滔 刘学书1220126114 实验地点:计算机学院大楼东309 实验时间:2015-04-20 一、实验室名称:软件实验室 二、实验项目名称:DES加解密算法实现 三、实验学时:4学时 四、实验原理: DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串 f1,f1与L0做不进位的二进制加法运算。运算规则为: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。 R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 经过置换IP-1后生成的比特串就是密文e。 变换f(Ri-1,Ki): 它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:

0-1背包问题四种不同算法的实现要点

兰州交通大学数理与软件工程学院 题目0-1背包问题算法实现 院系数理院 专业班级信计09 学生姓名雷雪艳 学号200905130 指导教师李秦 二O一二年六月五日

一、问题描述: 1、0—1背包问题:给定n 种物品和一个背包,背包最大容量为M ,物 品i 的重量是w i ,其价值是平P i ,问应当如何选择装入背包的物品,似的装入背包的物品的总价值最大? 背包问题的数学描述如下: 2、要求找到一个n 元向量(x1,x2…xn),在满足约束条件: ????? ≤≤≤∑1 0i i i x M w x 情况下,使得目标函数 p x i i ∑max ,其中,1≤i ≤n ;M>0; wi>0;pi>0。满足约束条件的任何向量都是一个可行解,而使得目标函数 达到最大的那个可行解则为最优解[1]。 给定n 种物品和1个背包。物品i 的重量是wi ,其价值为pi ,背包的容量为M 。问应如何装入背包中的物品,使得装人背包中物品的总价值最大?在选择装人背包的物品时,对每种物品i 只有两种选择,即装入背包、不装入背包。不能将物品i 装人背包多次,也不能只装入部分的物品i 。该问题称为0-1背包问题。 0-1背包问题的符号化表示是,给定M>0, w i >0, pi >0,1≤i ≤n ,要求找到一个n 元0-1向量向量(x1,x2…xn), X i =0 或1 , 1≤i ≤n, 使得 M w x i i ≤∑ ,而且 p x i i ∑达到最大[2]。 二、解决方案: 方案一:贪心算法 1、贪心算法的基本原理与分析 贪心算法总是作出在当前看来是最好的选择,即贪心算法并不从整体最优解上加以考虑,它所作出的选择只是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解。在一些情况下,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好近似解。 贪心算法求解的问题一般具有两个重要性质:贪心选择性质和最优子结构性质。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。 2、0-1背包问题的实现 对于0-1背包问题,设A 是能装入容量为c 的背包的具有最大价值的物品集合,则Aj=A-{j}是n-1个物品1,2,...,j-1,j+1,...,n 可装入容量为c-wj 的背包的具有最大价值的物品集合。 用贪心算法求解0-1背包问题的步骤是,首先计算每种物品单位重量的价值vi/wi ;然后,将物品进行排序,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总量未超过c ,则选择单位重量价值次高的物品并尽可能多地装入背包。

加密技术及密码破解实验报告

第九章、实验报告 实验一、设置Windows启动密码 一、实验目的:利用Windows启动密码保存重要文件。 二、实验步骤: 1、在Windows XP系统中选择开始——运行,在打开输入框中“syskey.exe”,点击确定,打开“保证Windows XP账户数据库的安全”对话框。 2、单击【更新】,打开【启动密码】对话框,然后输入密码,在【确认】文本框中再次输入密码,单击【确定】

实验二、为word文档加密解密 一、实验目的:保护数据的安全 二、实验步骤: 1、打开一个需要加密的文档,选择【工具】——【选项】——【安全性】然后输入想要设置打开文件时所需的密码 2、单击【高级(A)】打开加密类型对话框,选中【加密文档属性】复选框,单击【确定】。

3、打开文件的【确认密码】对话框,输入打开文件时需要的密码,单击【确定】,随即打开【确认密码】对话框,输入密码。 4、保存文件后,重新打开Word文档,打开【密码】,输入打开文件所需的密码,单击【确定】输入修改的密码,单击【确定】 破解word密码 (1)安装Advanced Office Password Recovery软件,安装完成后打开需要破解的word 文档,进行暴力破解,结果如图所示: 实验三、使用WinRAR加密解密文件

一.实验目的:加密文件,保证文件的安全性。 二.实验步骤: 1、在需要加密的文件夹上右击,选中【添加到压缩文件】打开【压缩文件名和参数】 2、选中【压缩文件格式】组合框中的【RAR】并在【压缩选项】中选中【压缩后删除源文件】然后切换到【高级】,输入密码,确认密码。 3、关闭对话框,单击确定,压缩完成后,双击压缩文件,系统打开【输入密码对话框】 破解WinRAR加密的文件 (1)安装Advanced RAR Password Recovery软件,打开WinRAR加密文件,进行暴力破解,获得密码。结果如图:

0-1背包问题研究及算法策略比较分析

数学与物理科学学院 《算法分析与设计》课程考查论文 题目0-1背包问题研究及算法策略比较分析 专业 班级 学号 姓名 任课教师 完成日期2011/5/24

背包问题是一个在运筹学领域里常见的典型NP-C难题,也是算法设计分析中的经典问题,对该问题的求解方法的研究无论是在理论上,还是在实践中都具有重要意义。对这个问题的求解已经研究出了不少的经典方法,对该问题的探索和应用研究一直在进行。在先进理论指导下,求解0-1背包问题具有科学、高效、经济、灵活、方便等显著特点。 那么要解决背包问题,首要的前提就是设计出好的算法,想求得背包问题的解,就要先设计出算法,本文采用回溯法对背包问题、0-1背包问题及简单0-1背包问题进行算法设计和时间复杂度分析,给出具体算法设计和实现过程。并以具体实例详细描述不同方法求解问题解时算法基本思想,然后就解决0-1背包问题对这四种算法进行详细的比较,总结这种方法实现的优缺点并得出结论。如何将背包问题应用于实际问题中,有针对性地设计适合求解实际0-1背包问题的算法,并很好地解决实际问题,是计算机工作者不断思索、研究的一个领域。

摘要 (2) 一、绪论 (4) 1.1问题的研究及意义 (4) 1.20-1背包问题的算法研究与分析 (4) 1.3课题的主要研究内容 (4) 二、0-1背包问题在动态规划中的实现 (5) 2.1动态规划的基本原理与分析 (5) 2.20-1背包问题的实现 (5) 三、0-1背包问题在分枝-限界法中的实现 (7) 3.1分枝-限界法的基本原理与分析 (7) 3.20-1背包问题的实现 (7) 四、0-1背包问题在遗传算法中的实现 (9) 4.1遗传算法的基本原理与分析 (9) 4.20-1背包问题的实现 (10) 五、0-1背包问题在回溯法中的实现 (11) 5.1回溯法的基本原理与分析 (11) 5.20-1背包问题的实现 (11) 5.30-1背包问题在回溯法中的算法描述 (12) 5.4算法效率 (14) 5.5运行结果 (15) 六、四种算法的比较与分析 (15) 七、附录 (17)

AES加密算法实验报告

实验报告 学号:姓名:专业:班级:第10周

简介 #in elude vstri ng> #in elude class pla in text { public : plai ntext(); static void createplaintext( unsigned char a[]); 实验内容(算法、 程 序、 步骤 和方 法)

static void SubBytes( unsigned char p[16]); static void inSubBytes( unsigned char p[16]); static void ShiftRows( unsigned char e[]); static void inShiftRows( unsigned char e[]); static void MatrixToByte( unsigned char e[]); static void inMatrixToByte( unsigned char e[]); static unsigned char FFmul( unsigned char a, unsigned char b); static void KeyAdding( unsigned char state[16], unsigned char k[][4]); static void KeyExpansion( unsigned char* key, unsigned char w[][4][4]); ~plai ntext(); private : }; #in elude "" using namespacestd; static unsigned char sBox[] = {}; /定义加密S盒/ unsigned char insBox[256] ={}; //定义解密S盒 pla in text ::plai ntext() { unsigned int p[16]; for (int j = 0; j<200; j++) { p[i] = a[i]; a[i] = a[i + 16]; } void pla in text ::createpla in text( un sig ned char a[]) // 仓U建明文 int i = 0; if ( a[j] == 0) for (; i<16; i++)

算法 0-1背包问题

一、实验目的与要求 掌握回溯法、分支限界法的原理,并能够按其原理编程实现解决0-1背包问题,以加深对回溯法、分支限界法的理解。 1.要求分别用回溯法和分支限界法求解0-1背包问题; 2.要求交互输入背包容量,物品重量数组,物品价值数组; 3.要求显示结果。 二、实验方案 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。 三、实验结果和数据处理 1.用回溯法解决0-1背包问题: 代码: import java.util.*; public class Knapsack { private double[] p,w;//分别代表价值和重量 private int n; private double c,bestp,cp,cw; private int x[]; //记录可选的物品 private int[] cx; public Knapsack (double pp[],double ww[],double cc) { this.p=pp;this.w=ww;this.n=pp.length-1; this.c=cc;this.cp=0;this.cw=0; this.bestp=0; x=new int[ww.length]; cx=new int[pp.length]; } void Knapsack() { backtrack(0); } void backtrack(int i) { if(i>n) { //判断是否到达了叶子节点 if(cp>bestp) { for(int j=0;j

古典加密实验报告

古典密码算法 一、实验目的 学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、实验要求 分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。 三、实验原理 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种算法:替代密码和置换密码。 1.替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。这里每个明文字母对应的密文字母可能是一个,也可能是多个。接收者对密文进行逆向替换即可得到明文。 2.置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。置换密码有时又称为换位密码。 我实验过程中替代密码是单表替换,用字母的下一个字母代替:for(j = 0; j < i; j++)

{ if(96 < Mingwen[j]&&Mingwen[j] < 123) { Miwen[j] = 'a' + (Mingwen[j] - 'a' + 1) % 26; } else { Miwen[j] = 'A' + (Mingwen[j] - 'A' + 1) % 26; } } 置换加密主要是对密钥进行整理,还有就是动态分配二维数组,将明文和密文填充置的过程,换密码关键代码如下: for(a = 0; a < k; a++) { for(b = 0; b < hang; b++) { Miwen[i] = p[b][ord[j]]; i++; } j++; } for(a = 0; a < 26; a++) { for(b = 0; b < k; b++) { if(key1[b] == alphatable[a]) { ord[b] = ind++; } } } 具体加密见下图:

DES加密与解密C实现+实验报告

DES加密与解密算法 课程名称:工程实践 学生姓名: xxxx 学生学号: xxxx 专业班级: xxxx 任课教师: xxxx 论文提交日期: xxxx

DES加密与解密算法 摘要 本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼(Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的“多重加密有效性理论”创立的,后于1977年由美国国家标准局颁布的数据加密标准。 DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES枣Data Encryption Standard)。 目前在这里,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 关键词:DES算法,加密,解密

Abstract This century since fifty time, cryptography research field is the most representative of the two Achievement. One was the 1971 USA scholar Tuchman (Tuchman) and Meyer (Meyer) based on information theory founder Shannon (Shannon) proposed "multiple encryption effectiveness theory" was founded, in 1977 after the National Bureau of standards promulgated by the America data encryption standard.The DES password is actually a further development of the Lucifer password. It is a traditional encryption method of block cipher. The algorithm is symmetric, which can be used for encryption and decryption can be used. In 1977 January, the government promulgated American: adopted IBM design as a non official data confidential data encryption standard (DES - Data Encryption Standard). At present here, along with three gold project especially golden card project startup, DES algorithm in POS, ATM, magnetic card and intelligent card (IC card), gas station, highway toll station and other fields are widely used, so as to realize the security of key data encryption transmission, such as credit card holders PIN, IC card and POS mutual authentication, financial transaction data package of MAC check and so on, are used in DES algorithm. Keywords: DES algorithm, encryption, decryption

算法设计和分析实验四:贪心算法求解背包问题

实验五:贪心算法求解背包问题 实验内容 应用贪心算法求解离散背包问题,分析时间复杂度。 有一个承重为W的背包和n个物品,它们各自的重量和价值分别是wi和vi(1<=i<=n),设求这些物品中最有价值的一个子集。如果每次选择某一个物品的时候,只能全部拿走,则这一问题称为离散(0-1)背包问题;如果每次可以拿走某一物品的任意一部分,则这一问题称为连续背包问题。 算法思想 ?动态规划的思想: –对较小的子问题进行一次求解,并把结果记录下来,然后利用较小问题的解,求解出较大问题的解,直到求解出最大问题的解。 – 引进一个二维数组ch[MAX][MAX],用ch[i][j]记录CH1与CH2的LCS 的长度,b[i][j]记录ch[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。 我们是自底向上进行递推计算,那么在计算ch[i,j]之前,ch[i-1][j-1], ch[i-1][j]与ch[i][j-1]均已计算出来。此时我们根据CH1 [i] = CH2[j]还是CH1[i] != CH2[j],就可以计算出ch[i][j]。 算法 length(string CH1,string CH2,int b[MAX][MAX]) //用于构建动态数组 //输入:两字符窜 //输出:最长公共子序列 for(i=1;i<=ch1Len;i++)//二重循环求解 for(int j=1;j<=ch2Len;j++) { if(CH1[i-1]==CH2[j-1])//相等字符

{ ch[i][j]=ch[i-1][j-1]+1; b[i][j]=0; } else if(ch[i-1][j]>=ch[i][j-1])//上比较大 { ch[i][j]=ch[i-1][j]; b[i][j]=1; } else//左比较大 { ch[i][j]=ch[i][j-1]; b[i][j]=-1; } } printCS(int b[MAX][MAX],string x,int i,int j) //回溯求出最长子序列输出 //输入:标记数组 //输出:最长子序列 if(i == 0 || j == 0)//边界,返回 return; if(b[i][j] == 0) { printCS(b, x, i-1, j-1);//左上 cout< using namespace std; #define MAX 100 //结构体 struct Elem { double W; double V;

背包问题(贪心算法)

算法分析与设计实验报告 第 4 次实验

}

附录:完整代码 #include #include #include struct node{ float value; float weight; }; float Value,curvalue=0; float Weight,curweight=0; //按价重比冒泡排序 void sort(node Node[],int M){ int i,j; node temp; for(i=0;i

相关文档
最新文档