算法分析与设计实验报告——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. 算法分析与设计实验报告 ——二分搜索程序算法的实现

    算法分析与设计实验报告 --二分搜索程序算法的实现 实验目的及要求 1.理解分治算法的概念和基本要素: 2.理解递归的概念: 3.掌握设计有效算法的分治策略: 4.通过二分搜索技术学习分治策略设计技巧 ...

  2. 算法分析与设计实验报告——实现汽车加油问题

    算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...

  3. 算法分析与设计实验报告——二分搜索算法的实现

    算法分析与设计实验报告--二分搜索算法的实现 目录: 算法分析与设计实验报告--二分搜索算法的实现 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与 ...

  4. 中北大学算法分析与设计实验报告一(BF算法)

    中北大学算法分析与设计实验报告一(BF算法) 1.实验名称 实验一 算法基础实验:数理基础与串匹配程序设计 2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表.堆.栈等数据结构知识,基于BF算 ...

  5. 算法分析与设计实验报告

    计算机算法分析与设计实验报告 实验一:递归回溯 阶乘(Factorial) #include<iostream> using namespace std; int factorial(in ...

  6. 中北大学算法分析与设计实验报告六(最大团问题)

    中北大学算法分析与设计实验报告六(最大团问题) 1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力. 3.训练知识点集群 (1) ...

  7. 动态规划算法实验报告_强化学习之动态规划算法

    如今的强化学习研究大体分为了两个研究学派:一个是以Sutton,Sliver等人为代表的value-based学派,他们主要从值函数近似角度入手去研究强化学习,这也是强化学习早期最初发展起来时沿用的路 ...

  8. 算法分析与设计实验报告三——动态规划算法

    一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10,w={2,2,6,5,4},v={6,3 ...

  9. Python算法分析与设计实验:动态规划算法

    Python算法分析与设计实验:动态规划算法 一.实验目的 1.理解动态规划求解优化问题的典型步骤,以及动态规划算法求解计算问题的时间复杂度分析 2.熟练掌握利用动态规划算法求解一维.二维等典型优化问 ...

  10. 2019春第二次课程设计实验报告

    2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...

最新文章

  1. 教学思路C#之入门五 数据类型转换
  2. github:已经提交并push后再次追加提交
  3. git显示服务器所有分支,怎么拉取git服务器上面的分支到本机?
  4. 《数据库SQL实战》从titles表获取按照title进行分组
  5. 让IE的F1帮助变成自己的
  6. 亚伦•斯沃茨:怎样有效利用时间
  7. 类的转换函数调用的优先级与是否用const修饰的关系
  8. Dapper基础用法
  9. android 表格xml,【Android】利用表格布局,Android中xml文件与java的交互制作登录界面...
  10. python实现水仙花数
  11. java 代码走查_代码走查如何保证软件质量
  12. php 如何查询数组,php
  13. 阿里云80端口无法访问
  14. java数组的四种拷贝方式
  15. 云计算、大数据、人工智能三者究竟有什么关系
  16. 按键精灵 获取网页flash游戏 句柄 以360浏览器为例
  17. GdPicture.NET SDK Crack,提供多种打印功能
  18. 第十二章 软件壳(四)(代码抽取型壳)
  19. 电容参数X5R,X7R,Y5V,COG
  20. QT pri 文件的作用

热门文章

  1. Python:输入概率,计算信源熵
  2. 「 软件安装 」嵌入式开发Keil5安装教程
  3. Dubbo底层源码解析
  4. 微软商店打开失败 - 错误代码 - 0x80131500
  5. 微软商店下载的python 的 pip 不能修改 config 的解决方法
  6. js html编码和解码,JavaScript字符集编码与解码
  7. 图像直方图规定化 matlab代码,MATLAB图像直方图规定化问题
  8. 梅小雨20190919-5 代码规范,结对
  9. 计算机科技文献中 CAM,计算机辅助设计、制造(CAD、CAM)和《机械制图》 课程的结合、探索与实践研究...
  10. 操作注册表修改防火墙