算法设计与分析.docx
- 文档编号:29613575
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:10
- 大小:49.47KB
算法设计与分析.docx
《算法设计与分析.docx》由会员分享,可在线阅读,更多相关《算法设计与分析.docx(10页珍藏版)》请在冰豆网上搜索。
算法设计与分析
华北电力大学
实验报告
|
|
实验名称算法设计与分析
课程名称算法设计与分析
|
|
专业班级:
学生姓名:
学号:
成绩:
指导教师:
牛为华实验日期:
2013.11
实验一0-1背包
一、实验目的
1.运用动态规划思想,设计解决上述问题的算法,找出最大背包价值的装法。
2.掌握动态规划的应用
二、实验内容及要求
问题描述:
给定n种物品和一背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。
不能将物品装入背包多次,也不能只装入部分的物品。
0-1背包问题是一个特殊的整数规划问题
三、实验仪器与设备
计算机,visualC++
四、问题分析与系统设计
动态规划方法建立在最优原则的基础上,以空间换取时间,将一个问题的解决方案视为一系列决策的结果。
在动态规划中,还要看每个最优决策序列中是否包含一个最优子序列。
即无论过程的初始状态和初始决策是什么,其余的决策必须相对于初始决策所产生的状态构成一个最优决策。
如果把第i个物品装入背包,则背包中物
品的价值就等于把前i-1个物品装入容量为iwj的背包中的价值加上第i个物品的价值iv;如果第i个物品没有装入背包,则背包中物品的价值就是等于把前i-1个物品装入容量为j的背包中所取得的价值。
取二者中价值较大者作为把前i个物品装入容量为j的背包中的最优解。
4、算法
#include
#include
voidknapsack(intv[100][100],intp[],ints[],intc,intn)//p数组为价值数组,s数组为重量数组,c表示背包最大容量,此函数为寻找最优值的函数
{
for(inti=0;i<=n;i++)
v[i][0]=0;
for(intj=0;j<=c;j++)
v[0][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=c;j++)
{
if(s[i]<=j)
{
if(v[i-1][j]>v[i-1][j-s[i]]+p[i])
v[i][j]=v[i-1][j];
else
v[i][j]=v[i-1][j-s[i]]+p[i];
}
else
v[i][j]=v[i-1][j];
}
cout<<"背包能装物品的最大价值为:
"< } voidtrackback(intv[100][100],ints[],intx[],intc,intn)//最优解函数 { for(intk=n;k>0;k--) { if(v[k][c]==v[k-1][c]) x[k]=0; else { x[k]=1; c=c-s[k]; } } cout<<"装入背包的物品为: "< for(k=1;k<=n;k++) cout< } voidprint(intv[100][100],intn,intc)//打印表格 { cout<<"表格如下所示: "< for(intk=-1;k<=c;k++) { if(k==-1) cout< else cout< } cout< for(inti=0;i<=n;i++) { for(intj=-1;j<=c;j++) { if(j==-1) cout< else cout< } cout< } } voidmain() { intc,n; intp[20],s[20],x[20]; cout<<"请输入物品数量: "< cin>>n; cout<<"请输入背包容量: "< cin>>c; intv[100][100]; cout<<"依次输入物品的价值: "< for(inti=1;i<=n;i++) cin>>p[i]; cout<<"依次输入物品的体积: "< for(i=1;i<=n;i++) cin>>s[i]; knapsack(v,p,s,c,n); print(v,n,c); trackback(v,s,x,c,n); } 五、实验结果 输入测试数据,n=5,c=22,p[i]=35789,s[i]=467910,程序运行的结果如下图所示。 六、总结与体会 0—1背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成0—1背包问题求解。 在做本次实验之前,自己对动态规划的原理不是非常的理解,花了很多时间看了课本上的相关内容。 课本所提供的代码也是不能直接用,当你懂得算法的基本原理后,你会发现数组下标会出错,课本所提供的代码数组下标一般都是从1开始,而我们输入的数据数组下标默认都是从0开始,所以在参考课本所提供的代码的同时,必须结合算法的实际情况对代码中的相关变量进行修改,这样才能充分利用课本所提供的代码完成本次实验。 通过本次试验,自己基本上掌握上述算法解0-1背包问题的原理,达到实验的目的。 实验二部分背包问题 一、实验目的 1、掌握部分背包问题的算法 2、初步掌握贪心算法 二、实验内容及要求 部分背包问题指的是: 有一个承重为W的背包和n个物品,它们各自的重量和价值分别是 iw和iv求这些物品中最有价值的一个子集。 如果每次可以拿走某一物品的任意一部分,则这一问题称为连续背包问题 三、实验仪器及设备 计算机,visualC++。 4、算法 #include #include structitem { intnum; floatvalue; floatweight; floatprice; }; voidcomput(itemr[],intn)//计算单位体积的价值 { for(inti=1;i<=n;i++) r[i].price=r[i].value/r[i].weight; } voidinsort(itemr[],intn)//直接插入排序按照单位体积的价值进行由大到小排序 { for(inti=2;i<=n;i++) { r[0]=r[i]; intj=i-1; while(r[0].price>r[j].price) { r[j+1]=r[j]; j--; } r[j+1]=r[0]; } } voidknapsack(itemr[],floatx[],intn,floatc) { for(inti=1;i<=n;i++) x[i]=0; floatcu=c; intk=1; while((k<=n)&&(r[k].weight<=cu)) { x[k]=1; cu=cu-r[k].weight; k++; } if(k<=n) x[k]=cu/r[k].weight; } voidmaxValue(itemr[],floatx[],intn) { floatmaxvalue=0; inti=1; while(i<=n) { if(x[i]! =0) maxvalue+=r[i].price*x[i]*r[i].weight; i++; } cout<<"该背包能装的最大价值是: "< } voidbestSolution(itemr[],floatx[],intn) { inti=1; cout<<"装入的物品编号"; cout< "< while(i<=n) { if(x[i]! =0) { cout< cout< } i++; } } voidmain() { floatx[20]; floatc;//总的背包容量 cout<<"请输入总的背包容量: "< cin>>c; intn;//总的物品数量 cout<<"请输入物品的总数量: "< cin>>n; itemr[20]; cout<<"分别输入各物品的价值: "< for(intj=1;j<=n;j++) cin>>r[j].value; cout<<"分别输入各物品的体积: "< for(inti=1;i<=n;i++) { r[i].num=i; cin>>r[i].weight; } comput(r,n); insort(r,n); knapsack(r,x,n,c); maxValue(r,x,n); bestSolution(r,x,n); } 五、实验结果 六、总结与体会 部分背包问题其实也和生活中很多问题相似,都是通过最优决策来选择。 此次实验让我对贪心算法的思想有了初步的了解,并且学会了用贪心算法解决一些实际问题。 两个程序中都运用了循环语句,在编写代码时,在循环语句的设置中遇到许多问题,经过调试最终解决。 所以,以后应当多做一些循环语句的练习。 通过实践加强编程的熟练程度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)