算法分析与设计实验报告——0-1背包问题的动态规划算法实现
算法分析与设计实验报告——0-1背包问题的动态规划算法实现
目录:
- 算法分析与设计实验报告——0-1背包问题的动态规划算法实现
- 一、 实验目的
- 二、实验要求
- 三、 实验原理
- 四、 实验过程(步骤)
- 五、 运行结果
- 六、实验分析与讨论
- 七、实验特色与心得
- 附件一 实验过程(步骤)
- 附件二 运行结果
一、 实验目的
掌握动态规划的基本思想和解决问题的基本步骤,认识动态规划和分治法的联系与区别,对比解决同一问题的两种算法设计策略的时间复杂性。
二、实验要求
用c++语言实现用动态规划算法解决0-1背包问题,分析时间复杂性,体会动态规划算法解决问题的基本思路和步骤。
三、 实验原理
0-1 背包问题具有最优子结构性质,可以据此定义递归关系,建立递归方程,并以自底向上的方式计算最优值,根据计算最优值时的得到的信息,构造最优解。
设所给 0-1 背包问题的子问题的最优值 m(i,j) ,即 m(i,j) 是背包重量为 j ,可选物品为 i,i+1,…,n-1 时的最优值。由最优子结构性质,可以计算出 m(i,j) 的递归式如下:
四、 实验过程(步骤)
见附件一
实验步骤、特点
重要源代码(流操作的部分要醒目的提示并注释)
五、 运行结果
见附件二
六、实验分析与讨论
刚开始运行并没有得到最优解,经过检查程序发现有一个判断条件出错了,修改后结果依然不变,再次阅读程序没有发现问题,然后开始查阅课本,再重新理解一下这个问题。思考后想到了数组的范围设置错误,导致了结果偏移的问题。修改后结果得到了最优解。
七、实验特色与心得
0-1 背包问题具有最优子结构性质,所以可以用动态规划方法求解。根据这种性质定义递归关系并建立递归方程,以自底向上的方式计算最优值。而且以后编程时要彻底理解问题后再构造算法。
附件一 实验过程(步骤)
#include <bits/stdc++.h>
#define maxn 100
using namespace std;
void Knapsack(int *v, int *w, int c, int n, int (*m)[maxn]) {//先判断第n个物品能不能装入背包int jMax = min(w[n] - 1, c);//当0<=j<=wn时,m(n,j)=0for (int j = 0; j <= jMax; j++) {m[n][j] = 0;}//当j>=wn时,m(n,j)=vnfor (int j = w[n]; j <= c; j++) {m[n][j] = v[n];}//再从n-1往前开始判断第n个物品到第i个物品能不能装下for (int i = n - 1; i > 1; i--) {jMax = min(w[i] - 1, c);for (int j = 0; j < jMax; j++) {m[i][j] = m[i + 1][j];}for (int j = w[i]; j <= c; j++) {m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);}}//判断第n个到第1个物品能不能装下m[1][c] = m[2][c];if (c >= w[1])m[1][c] = max(m[1][c], m[2][c - w[1]] + v[1]);
}//回溯查找最优序列,能装下的赋值为1,不能装下的赋值为0
void Traceback(int (*m)[maxn], int *w, int c, int n, int *x) {for (int i = 1; i < n; i++) {if (m[i][c] == m[i + 1][c])x[i] = 0;else {x[i] = 1;c -= w[i];}}x[n] = (m[n][c]) ? 1 : 0;
}
int main() {//进行数据输入int n, c;cout << "请输入物品数量 n=";cin >> n;cout << "请输入背包容量 c=";cin >> c;int w[n];cout << "请依次输入各物品的重量:";for (int i = 1; i <= n; i++) {cin >> w[i];}int v[n];cout << "请依次输入各物品的价值:";for (int i = 1; i <= n; i++) {cin >> v[i];}int m[maxn][maxn];int x[n];int max_weight = 0;int max_value = 0;//进行查找与回溯Knapsack(v, w, c, n, m);Traceback(m, w, c, n, x);//输出最优序列和最优重量与最优价值cout << "最优装载序列为:\n";for (int i = 1; i <= n; i++) {printf("%d ", x[i]);max_weight += (x[i] * w[i]);max_value += (x[i] * v[i]);}cout << endl;printf("最大重量为: %d\n最大价值为: %d\n", max_weight, max_value);return 0;
}
/*
5
10
2 2 6 5 4
6 3 5 4 6
*/
附件二 运行结果
算法分析与设计实验报告——0-1背包问题的动态规划算法实现相关推荐
- 算法分析与设计实验报告 ——二分搜索程序算法的实现
算法分析与设计实验报告 --二分搜索程序算法的实现 实验目的及要求 1.理解分治算法的概念和基本要素: 2.理解递归的概念: 3.掌握设计有效算法的分治策略: 4.通过二分搜索技术学习分治策略设计技巧 ...
- 算法分析与设计实验报告——实现汽车加油问题
算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...
- 算法分析与设计实验报告——二分搜索算法的实现
算法分析与设计实验报告--二分搜索算法的实现 目录: 算法分析与设计实验报告--二分搜索算法的实现 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与 ...
- 中北大学算法分析与设计实验报告一(BF算法)
中北大学算法分析与设计实验报告一(BF算法) 1.实验名称 实验一 算法基础实验:数理基础与串匹配程序设计 2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表.堆.栈等数据结构知识,基于BF算 ...
- 算法分析与设计实验报告
计算机算法分析与设计实验报告 实验一:递归回溯 阶乘(Factorial) #include<iostream> using namespace std; int factorial(in ...
- 中北大学算法分析与设计实验报告六(最大团问题)
中北大学算法分析与设计实验报告六(最大团问题) 1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力. 3.训练知识点集群 (1) ...
- 动态规划算法实验报告_强化学习之动态规划算法
如今的强化学习研究大体分为了两个研究学派:一个是以Sutton,Sliver等人为代表的value-based学派,他们主要从值函数近似角度入手去研究强化学习,这也是强化学习早期最初发展起来时沿用的路 ...
- 算法分析与设计实验报告三——动态规划算法
一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10,w={2,2,6,5,4},v={6,3 ...
- Python算法分析与设计实验:动态规划算法
Python算法分析与设计实验:动态规划算法 一.实验目的 1.理解动态规划求解优化问题的典型步骤,以及动态规划算法求解计算问题的时间复杂度分析 2.熟练掌握利用动态规划算法求解一维.二维等典型优化问 ...
- 2019春第二次课程设计实验报告
2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...
最新文章
- 教学思路C#之入门五 数据类型转换
- github:已经提交并push后再次追加提交
- git显示服务器所有分支,怎么拉取git服务器上面的分支到本机?
- 《数据库SQL实战》从titles表获取按照title进行分组
- 让IE的F1帮助变成自己的
- 亚伦•斯沃茨:怎样有效利用时间
- 类的转换函数调用的优先级与是否用const修饰的关系
- Dapper基础用法
- android 表格xml,【Android】利用表格布局,Android中xml文件与java的交互制作登录界面...
- python实现水仙花数
- java 代码走查_代码走查如何保证软件质量
- php 如何查询数组,php
- 阿里云80端口无法访问
- java数组的四种拷贝方式
- 云计算、大数据、人工智能三者究竟有什么关系
- 按键精灵 获取网页flash游戏 句柄 以360浏览器为例
- GdPicture.NET SDK Crack,提供多种打印功能
- 第十二章 软件壳(四)(代码抽取型壳)
- 电容参数X5R,X7R,Y5V,COG
- QT pri 文件的作用
热门文章
- Python:输入概率,计算信源熵
- 「 软件安装 」嵌入式开发Keil5安装教程
- Dubbo底层源码解析
- 微软商店打开失败 - 错误代码 - 0x80131500
- 微软商店下载的python 的 pip 不能修改 config 的解决方法
- js html编码和解码,JavaScript字符集编码与解码
- 图像直方图规定化 matlab代码,MATLAB图像直方图规定化问题
- 梅小雨20190919-5 代码规范,结对
- 计算机科技文献中 CAM,计算机辅助设计、制造(CAD、CAM)和《机械制图》 课程的结合、探索与实践研究...
- 操作注册表修改防火墙