背包问题实验报告

2024-05-24 版权声明 我要投稿

背包问题实验报告(通用10篇)

背包问题实验报告 篇1

大 学 计 算 机 学 院 实 验 报 告

计算机学院

2017

软件工程

专业

指导教师

学号

姓名

2019

年 10

月 21

成绩

课程名称 算法分析与设计 实验名称 动态规划---0-1 背包问题①理解递归算法的概念

实验目的②通过模仿 0-1 背包问题,了解算法的思想③练习0-1 背包问题算法

实验仪器 电脑、jdk、eclipse 和器材

实验:

0-1 背包算法:给定

N 种物品,每种物品都有对应的重量

weight 和价值 value,一个容

量为 maxWeight 的背包,问:应该如何选择装入背包的物品,使得装入背包的物品的总价值

最大。(面对每个物品,我们只有拿或者不拿两种选择,不能选择装入物品的某一部分,也 实

验 不能把同一个物品装入多次)代码如下所示:

内 public class

KnapsackProblem {

容 /**

、上 * @paramweight 物品重量

机 * @paramvalue 物品价值 调 * @parammaxweight

背包最大重量

程 *

@return maxvalue[i][j] 中,i 表示的是前 i 个物品数量,j 表示的是重量

序 */

、public

static

int knapsack(int

[]

weight , int

[]

value , int

maxweight){

内 int

n =;

包问题的算法思想:将前 i 个物品放入容量 容 为 w 的背包中的最大价值。有如下两种情况:、①若当前物品的重量小于当前可放入的重量,便可考虑是 上 否要将本件物品放入背包中或者将背包中的某些物品拿出 机 来再将当前物品放进去;放进去前需要比较(不放这个物 调 品的价值)和(这个物品的价值放进去加上当前能放的总 试 重量减去当前物品重量时取

i-1 个物品是的对应重量时候 程 的最高价值),如果超过之前的价值,可以直接放进去,反 序 之不放。

、②若当前物品的重量大于当前可放入的重量,则不放入 程 背包问题利用动态规划的思路可以这样理解:阶段是“物 序 品的件数”,状态就是“背包剩下的容量”,f[i,v]

表示设 运 从前 i 件物品中选择放入容量为 V 的背包的最大价值。那 行 么状态转移的方法为

:

f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+c[i]}

这个方程可以理解为:只考虑子问题“将前 i 个物品放入

容量为 v的背包中的最大价值” 那么可以考虑不放入

i,最

大价值就和 i

无关,就是 f[i-1][v], 如果放入第i

个物品,价值就是 f[i-1][v-w[i]]+value[i], 只取最大值即可。

容、上

序、程

背包问题实验报告 篇2

1背包问题

0-1背包问题:给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。问应如何选择装入背包中物品,使得装入背包中物品的总价值最大?

对于一个实例:物品种类N=4,背包容量C=10,物品重量数组W={3,5,2,1},相应价值数组V={9,10,7,4}。找一个n元0-1向量(x1,x2,x3….xn)xi∈{0,1},1≤i≤n.使得

达到最大。下面分别以动态规划法和回溯法来解决这个实例。

2动态规划法

动态规划法的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。用一个表来保存记录所有已解决的子问题的答案,在需要的时候再找出已求得的答案,避免重复的计算。

动态规划法适用于解最优化问题。通常可按以下4个步骤:

(1)找出最优解的性质并刻画其结构特征。

(2)递归的定义最优解。

(3)以自底向上的方式计算出最优值。

(4)根据计算最优值时到得的信息,构造最优解。

对于所给0-1背包问题的子问题:

的最优值为m(i,j),即m(i,j)是背包容量为j,可悬着物品为i,i+1,….,n时0-1背包问题的最优值。由于0-1背包问题的最优子结构性质,可以建立计算m(i,j)的如下递归式:

(1.1)

(1.2)

从上面算法的执行过程中可以看出假设有Q(n)个子问题,每一个子问题最多需要m次决策,则计算的频率为nm,回溯的频率为n,那么整个过程的算法的时间复杂度为T(n)=nm+n,即为Q(nm)。

3回溯法。

回溯法在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。回溯算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。简单地说就是确定解空间,建立解空间树,用深度优先搜索算法递归搜索解空间树,并同时注意剪枝。

用回溯法解题的步骤:

(1)针对所给问题定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效的搜索。

根据上述0-1背包问题的数学描述解向量可以表示成X={X,X,...X|X=0或=1}若X=0,表示第i个物品不装入背包,X=1,表示将第i个物品装入背包。

可以用树的形式将解空间表达出来。树中从第i层到第i+1层的边上的值表示解向量中X的取值,并假定第i层的左子树描述第i个物品被装入背包的情况,右子树描述第i个物品被拒绝的情况。则该0-1背包问题的状态空间树就表示为一棵高度为n的完全二叉树。若n=3时则此0-1背包问题的解空间的结构如图1-1所示。从根结点到叶子结点的.任一路径就对应解空间中的一个解向量

图1-1n=3时,0-1背包问题的解空间树

用回溯法求解0-1背包问题时,可以按照物品的单位价值从大到小排序。计算当前节点的上界,搜索左子树。只有当右子树包含可行解时才搜索右子树。剪去右子树的条件是当前价值加上剩余物品的总价值小于当前的最优总价值时,不需搜索右子树,可将右子树剪去。回溯法用一定的剪枝进行优化,算法的时间复杂度为O(n*2n),n为物品个数。

4总结

动态规划算法:动态规划可以把困难得多阶段决策变换为一系列相互联系比较容易的单阶段问题。对于背包问题可以对子过程用枚举法求解,而且约束条件越多,决策的搜索范围越小,求解也越容易。但是对于规模较大的问题它并不是一个理想的算法。最重要的原因就是它的维数障碍。即计算和存储量的需要对于状态空间和决策空间的维数的增长呈指数增长关系,这样惊人的增长速度是计算机难以承受的。这就使得直接的动态规划方法求解规划较大的背包问题发生了困难,且目前尚没有好的解决办法。

回溯法:回溯法需要为问题定义一个解空间,这个解空间必须至少包含问题的一个解(可能是最优的)。使用递归回溯法解决背包问题的优点在于它算法思想简单,而且它能完全遍历搜索空间,肯定能找到问题的最优解。但是由于此问题解的总组合数有2个,因此,随着物件数n的增大,其解的空间将以2级增长,当n大到一定程度上,用此算法解决背包问题将是不现实的。

背包问题实验报告 篇3

若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。(课程线性排列,每门课上课时其先修课程已经被安排)。

基本要求:

(1)输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。

(2)若根据输入条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。

一、需求分析:

本程序需要基于图的基本操作来实现

二、概要设计 :

抽象数据类型 :

为实现上述功能需建立一个结点类,线性表类,图类。

算法的基本思想 :

1、图的构建:

建立一个结点类,类的元素有字符型变量用来存储字母,整形变量用来存储位置,该类型的指针,指向下一个元素。建立一个线性表类,完成线性表的构建。建立一个图类,完成图的信息的读取,(如有n个点,则建立n个线性表,将每个结点与其指向的结点组成一个线性表,并记录线性表的长度)。

2、Topsort算法:

先计算每个点的入度,保存在数组中。找到第一个入度为0的点,将该点所连的各点的入度减一。再在这些点中找入度为0 的点。如果找到,重复上述操作。如果找不到,则跳出while循环,再搜索其他的点,看入度是否为0。再重复上述操作,如果所有的入度为0的点都被寻找到,但个数少于输入顶点的个数,说明该图存在环。程序的流程

程序由三个模块组成:

输入模块: 读入图的信息(顶点和边,用线性表进行存储)。处理模块:topsort算法。输出模块:将结果输出。

三、详细设计

算法的具体步骤: class Node{//结点类 public: string node;int position;//位置 Node* next;bool visit;//是否被访问

Node(){visit=false;next=NULL;position=0;node=;} };class Line{ //线性表类 public: int num;Node* head;Node* rear;Node* fence;Line(){num=0;head=fence=rear=new Node();} void insert(int v,string ch){ //插入元素

Node* current=new Node();

current->node=ch;

current->position=v;

fence->next=current;

fence=current;

num++;} };class Graph{ //图类 private: int numVertex;int numEdge;Line* line;public: Graph(int v,int e){numVertex=v;numEdge=e;line =new Line[v];} void pushVertex(){ //读入点

string ch;

for(int i=0;i

cout<<“请输入顶点”<

cin>>ch;

line[i].head->node=ch;

line[i].head->position=i;

} } void pushEdge(){ //读入边

string ch1,ch2;

int pos1,pos2;

for(int i=0;i

{

cout<<“请输入边”<

cin>>ch1>>ch2;

for(int j=0;j

if(line[j].head->node==ch1)

pos1=j;//找到该字母对应的位置

if(line[j].head->node==ch2){

pos2=line[j].head->position;

break;

}

}

line[pos1].insert(pos2,ch2);

} } void topsort(){ //拓扑排序

int i;

int *d=new int[numVertex];

for(i=0;i

d[i]=0;//数组初始化

for(i=0;i

Node* p=line[i].head;

while(p->next!=NULL){

d[p->next->position]++;//计算每个点的入度

p=p->next;

}

} int top=-1,m=0,j,k;

for(i=0;i

if(d[i]==0){

d[i]=top;//找到第一个入度为0的点

top=i;

}

while(top!=-1){ j=top;top=d[top];

cout<node<<“ ”;m++;

Node* p=line[j].head;

while(p->next!=NULL){

k=p->next->position;

d[k]--;//当起点被删除,时后面的点的入度-1

if(d[k]==0){

d[k]=top;

top=k;

}

p=p->next;

}

}

} cout<

cout<<“网络存在回路”<>n>>m;Graph G(n,m);G.pushVertex();G.pushEdge();G.topsort();system(“pause”);return 0;}

四、调试分析

略。

五、测试结果

本实验的测试结果截图如下:

注:此处由于不会用文件流输入和输出,故在命令提示符上直接进行输入。

六、用户使用说明(可选)

1、本程序的运行环境为windows 操作系统,执行文件为Untitled1.exe 2、运行程序时

提示输入数据 并且输入数据然后回车就可以继续输入相应数据,最后即可得到结果。

七、实验心得(可选)

1、本实验是在图的遍历问题的基础上做的,图的构建大部分是采用图 的遍历问题中的代码(不过要将结点类中的char改为string型),自己另外写了topsort函数,就完成了整个程序。

2、topsort函数中一开始采用的方法是找到一个入度为0的点,完成 相应的操作后,重新进行搜索,后来改进代码,先搜索入度为0的 点后面连接的点,这样减少了算法复杂度。

附录(实验代码):

#include #include using namespace std;class Node{//结点类 public: string node;int position;//位置 Node* next;bool visit;//是否被访问

Node(){visit=false;next=NULL;position=0;node=;} };class Line{ //线性表类 public: int num;Node* head;Node* rear;Node* fence;Line(){num=0;head=fence=rear=new Node();} void insert(int v,string ch){ //插入元素

Node* current=new Node();

current->node=ch;

current->position=v;

fence->next=current;

fence=current;

num++;} };class Graph{ //图类 private: int numVertex;int numEdge;Line* line;public: Graph(int v,int e){numVertex=v;numEdge=e;line =new Line[v];} void pushVertex(){ //读入点

string ch;

for(int i=0;i

cout<<“请输入顶点”<

cin>>ch;

line[i].head->node=ch;

line[i].head->position=i;

} } void pushEdge(){ //读入边

string ch1,ch2;

int pos1,pos2;

for(int i=0;i

{

cout<<“请输入边”<

cin>>ch1>>ch2;

for(int j=0;j

if(line[j].head->node==ch1)

pos1=j;//找到该字母对应的位置

if(line[j].head->node==ch2){

pos2=line[j].head->position;

break;

}

}

line[pos1].insert(pos2,ch2);

} } void topsort(){ //拓扑排序

int i;

int *d=new int[numVertex];

for(i=0;i

d[i]=0;//数组初始化

for(i=0;i

Node* p=line[i].head;

while(p->next!=NULL){

d[p->next->position]++;//计算每个点的入度

p=p->next;

}

} int top=-1,m=0,j,k;

for(i=0;i

if(d[i]==0){

d[i]=top;//找到第一个入度为0的点

top=i;

}

while(top!=-1){ j=top;top=d[top];

cout<node<<“ ”;m++;

Node* p=line[j].head;

while(p->next!=NULL){

k=p->next->position;

d[k]--;//当起点被删除,时后面的点的入度-1

if(d[k]==0){

d[k]=top;

top=k;

}

p=p->next;

}

}

} cout<

背包问题实验报告 篇4

? ? ? ?暑假去西部,第一站是古都西安,我想那里应该是中国或者大部分外国背包客行走的第一站了,至少我想更多的中国背包客是来自中部和东部沿海地方的。在西安行走,遇到过很多来自国外的背包客,而且总是很有活力的感觉,背着包,有的是长发的扎个辫子,有的带着头巾,手上拿着貌似是从google上面打印下来的地图,用英文问着路人他们要去的方向,而且在西安鼓楼钟楼那附近出现的外国面庞是非常的多的,在武汉我也是常常遇到外国面庞,但是我的感觉武汉的黑皮肤的人多一些,而且每次我去广埠屯都会遇到好几个黑皮肤的老外在买电子产品,当然我一直觉得我之前买的一个二手的电子产品也许就是那些人卖掉的。言归正传,在西安的时候,有两个年轻的白皮肤的老外在向我问路,但是我当时也是刚到西安不知道路,也是非常草率的回答了,当时我表示自己之前没有做足功课,至少那次完全没有做足功课,我一直觉得一个城市只要我之前好好的看了地图就能装的和本地人一样了,可惜我错了。当时问路的时候也有两个和我差不多的男生在旁边,当时问路的时候也是说不是西安本地的。暑假去西安还真是对的啊。

? ? ?在从西安继续西行的火车上我也遇到了一个老外,长头发的,穿着黑衣服,当时我的想法是老外居然坐的是硬座,然后一直看着他看着本英文书,然后他的背包很大,从地上一直可以到他的怀里,活生生的就是背包客形象,我就想这么的一个人不远万里来到中国,感受暑运,而且是西部这样的冗长的铁路线路,一坐就是二十个小时的那种,没有高铁,没有动车,而且没有卧铺,甚至还是一个人就坐到了前往中国西部的火车上。

? ? ?背包客是种文化,这个是我深深地感触,特别是在错过了去敦煌之后,至少我一直都觉得那些很多沿着兰新线西去的人很多都是为了去敦煌,那个艺术的圣地,在错过敦煌我越发的觉得自己是错过了一场美妙的盛宴了。敦煌美不胜收。而且那边是最好的感受背包客文化的地方,全世界的背包客都会去那边感受一个古老国度的文化艺术气质,一个关于大唐盛世的故事集。一个关于丝绸之路的美轮美奂的艺术享受。

背包作文600字 篇5

午饭过后的校园,总是有种生的气息,将麻木的四肢曝晒在太阳下,让骨里的寒气升腾,化作一羽翎,消失不见。但我也常常感伤,因为一曲你的背包。

一九九五年,我们在机场的车站,

你借我,我不想归还,

那个背包载满纪念品和患难,

还有摩擦留下的图案,

旧时,是因为曲调。那时带着少年时期的彷徨与热忱,文艺地怀古伤今,读出了辛酸的味道。但这仅仅是忧伤的明媚,我们逛着一圈一圈的操场,谈论着无厘头的种种,铃声总是穿过树叶的罅隙,影影绰绰的提醒着时间的流逝。

现在的我,却在记忆里,颓废。

因为总是记得,因为不舍放弃,因为一直,不肯向前走。

因为怀念那个文艺的女子。

她会说,我们一个像夏天,一个像冬天,仿佛在火炉边摸到了雪。

因为,她也送了我一个背包。

我背着它,走过另一片香樟树荫,欣赏另一段风景。

记忆里朦胧的影子,我们曾无话不说,伸手在走廊试图接起因风而起的樱花花瓣。阳光很刺眼,虚幻流年,我睁不开眼。

它承载着厚实的书本,也负担了我日积月累下来的碎碎念,假若时光可以倒退,那么,不长大其实也是一件乐事。

越来越飘渺了,我所剩的残念拼凑出来的身形,也开始远远离去。我把背包带抓得很紧,用尽全身的力气。

她是否在另一片树荫下过得很好,她是否还带着天真无邪。烂漫的笑呢?

人们总是这样,因为环境不同,在适应的同时,开始慢慢的遗忘。

你的背包对我严重的审判,

背包作文300字 篇6

可是这次不一样,今天快递来了,我打开包裹,一个黑色的包包静静躺在快递箱里,一个红色正方形,里面是一个白色十字的上标引起了我的注意,我好像见过它,只是想不起来。

这个包由一种类似皮革的面料和尼龙料组成,类似皮革的面料摸上去十分光滑柔软,尼龙料摸着也十分有质感,整个看上去也大气美观,没有意思粗糙。

打开背包,一层一层的让我看的五体投地。它分为四层,拥有四个夹层,这八个空间像是拼七巧板一样紧凑,别看它紧凑,仍能装很多东西,我估计了一下,大约能装4厘米宽、21厘米高、1.5厘米厚的书38本!

第一次观察的时候发现,它没有背的带子,只有背包的顶部有个手提的小环。我还以为它是手提包。后来才发现,它是把背带藏到了书包的最后一层,不得不佩服设计师的脑洞。

背包作文300字 篇7

一名风度翩翩的少年背着我来到火车站。水泄不通的人群非常拥挤,令我感到十分不适。

我们来到一片湖泊,人群更是多的数不过来。我问脚下的石头老兄,说:“喂,老兄这到底是个什么地方?为什么这么多人都来参观?”“这你可就有所不知了吧,这里可是著名的旅游景点,茶卡盐湖,这里不但风景秀丽,更有极致的体验,还有天空之境的美誉呢。”“哦,那我可要好好瞧瞧了。”

女性职场背包选择 篇8

背包和服饰是相互搭配的,但是职场女性在选择背包的时候也要讲究礼仪,有的人说,要一套衣服搭配一个包,其实东西在于多,而在于搭配,职业女人有五个包就可以了:

1、职业包

职业包,能装下a4纸的尺寸,最好是手提的.不是肩背的,背着这么大、沉的包显得没有女人味了,略微方正、皮质略微硬一点,软塌塌的一放职业形象荡然无存,上班下班所有的东西基本都能放下;

2、单肩挎包

单肩挎包即背包,东西少的时候可以用来上班、可以用来约会、可以用来吃饭也可以逛街,但可放的东西太少,所以可以选择比较时尚,但它在职业场合时往往要和第三个配着使用。

3、放着能立住的包

放着能立住的包,能装下杂志、电脑,是给女人用的式样,是和第二个包一起用的,背一个单肩挎包手里提着这个包走路,见客户时第三个包放在地上,从里面拿资料,这是职业女性特别好的背包法则和形象。职业女性在职场或出差途中可别拎塑料袋,在职场、开会、出差途中拎塑料袋甚至纸袋都是不协调的,最好发展你的第三包;

4、出差包

这种包既能用来玩也能用来出差,能装很多东西,哪种质地都可以,软料、布类都行,这个包的最大特点是最好能斜挎,里面有很多小格格,能放很多东西,拿东西方便;

5、晚会包

《背包十年》读书笔记 篇9

他们走在路上,体验着自己的欢乐,感受着与其他人同空间但不同时间的奇妙相遇感,然后追求属于自己的自由。

而自由,也就是孤独的另一个名字。

在书中,作者提到了梵高,这让我想起了去年在电影院看的《至爱梵高》,不知怎么的,看到后来慢慢就流泪了,我并不能说清楚他的画作有多么好,只能感受到,他是一个真正爱艺术,也愿意把生命奉献给艺术的人。

在他的世界里,没有那么多规矩,没有那么多束缚,他有着最强烈的生命体验,最在乎自由意志的表达。他的黑夜比白天白,他的色彩比世界更丰富,用手中的笔,表现心中的世界,简简单单,直来直往。

想来这也是一切伟大艺术家共通的地方,我不知道规矩,我来给你们立规矩。

而后来研究规矩越多的人,一般都出不了伟大作品,因为他们的精力都耗费在圈地、守坟,然后规范他人的行为中去了,生命最原始的想象力,早早被丢掉。

得失得失,有得,必有失。

04

我喜欢小鹏,因为很多时候,我也像他一样,坐不住,只喜欢做自己真正喜欢的事情。

我也敢于坚持自己的所爱,这需要勇气,需要耐力,然后下最笨的功夫,一步一步去走。

季羡林老先生说过:聪明人下笨功夫,一般能有大成就;笨人下笨功夫,也会有属于自己的成绩。我是一个笨人,坚持做自己,下点笨功夫,想来,未来也会收获自己的一亩三分地吧。

前些年都是穷游,现在状况好了些,可以自由挑选喜欢的地方去旅行,所以我还会一直走出去,看看,体验,反思,然后收获属于自己的点点滴滴。

旅途中我会拍照,会品尝当地美食,和人聊天,畅玩,回家后写成属于自己的体验式游记。一路走完,我觉得很爽。

开心,最重要;开心的成长,很酷。

所以当我再次遇到这本书,看到封面上的行者,背着旅行包正在前行时,还会很触动,心动,打开,收获几年后再次相遇的感动。

《背包十年》读书笔记 篇10

书中的内容是写作者十年里到过的地方,每个地方遇到故事,包括自己经历的,他或她遇到的,或者是那个地方里著名的他或她过去发生的,一切都是作者的题材。每个标题都充满诱惑,每段故事的开头都给你往下看的动力。每个故事篇幅不长,就一两页,但都具有代表性,结尾都带点作者的感悟。

所有彩照里其中有两张看来很普通的照片,一张是今年去过的吴哥窟里有名的高棉微笑,图片照的只是那宽厚的嘴唇,下面写着“我明白信仰是一种嘴角上扬的人生态度……”,对于作者来说,旅行就是他的信仰。另一张是一对情侣抬头仰望着被晚霞染成淡紫色的天空和大海,下面写着“羡慕他们可以一起笑看风轻云淡”,旅行时要能做到真正的抛开所有,享受自由,的确令人向往。

旅行无法复制,旅行除了游览风光,品味美食,了解文化历史外,在旅行前收集资料、计划路线、安排行程和旅行后整理照片、写游记都是旅行中值得享受的过程。

旅行给我们留下的除了经历,应该就是难忘的回忆吧,记住每一处迷人的风景,记住每一个帮助过你的人,记住每一张腼腆的笑脸。那些天天被拍的孩子们我们希望他们保持纯真,虽然我们可能给不到他们什么,但我们会永远记住他们付出过的笑容。

上一篇:一年级英语下册精编练习题下一篇:科技项目工作