算法设计与分析/数据结构与算法实验6:0-1背包问题(回溯法)

简介: 算法设计与分析/数据结构与算法实验6:0-1背包问题(回溯法)

1.实验目的

(1)掌握回溯法的处理思路与算法框架。

(2)掌握应用回溯法解决具体问题的方法。

(3)掌握回溯法的广泛应用。

2.实验内容

(1)问题描述

image.png


要求使用回溯法解决该问题。

(2)输入

image.png


(3)输出

image.png


3.问题实例分析

image.png


因此,先装入第一个物品,此时体积足够装入第二个物品。装完第二个物品后,还能在装第三个物品。以深度优先的顺序,此时访问到的解空间树的结点如图所示:

注意:我自己都觉得图太丑了,大家画图时不要为了方便用wps自带的画图工具画!!!还是visio好!!!

image.png

image.png


从该结点回溯到上一结点,并在访问右子树前分别计算每个结点的当前价值cp与剩余价值r,发现都可以将右子树直接剪枝剪掉。

image.png

image.png

image.png


4.算法描述及说明

正如第3节问题实例分析所述,算法的整体流程如下:

1.输入数据,并对每个物品进行编号。

2.计算每个物品的单位价值,并将物品按单位价值排序。

3.对于第i ii个物品,判断剩余体积是否能够装下该物品。

4.若能装下该物品,则将该物品装入,并构造相应结点。

5.若不能装入该物品,则不将该物品装入,考虑下一物品。

6.在第4步中的物品撤出背包,构造相应结点,并计算剩余物品能产生价值的上界。若上界大于当前最优解,则装入考虑下一物品,否则不考虑。

7.重复3-6的步骤,直到所有物品都被考虑过。

5.算法正确性分析

算法会正确地结束:在遍历完解空间后,找到了使总价值最大的解,算法会停止。

回溯法的正确性分析:开始时,根结点是解空间树唯一的活结点,也是当前的扩展结点。在这个扩展结点处,搜索向深度方向移至一个新节点。这个新结点成为新的扩展结点。如果在当前扩展结点处不能再向纵深方向移动,则当前扩展结点成为死结点。应回溯至最近的活结点处,使得这个活结点成为当前扩展结点。回溯法以系统的方式递归地在解空间树中进行搜索,直到找到所要求的解惑解空间中已无活结点。

因此,利用回溯法会系统地查找背包问题的所有可行解,在剪枝时利用限界函数与剪枝函数剪去了不可行的分支,保留了可行并能产生最大解的分支。

从而,该算法是正确的。

6.算法时间复杂性分析

image.png

7.运行结果展示及其说明

image.png

8.心得体会

9.程序源代码

#include<iostream>
#include<algorithm>
using namespace std;
double cw;//当前重量
double cp;//当前价值
double bestp;//当前最优价值
int n;//物品数量
double c;//背包容量
const int N = 105;
int x[N];
struct Bag {
  double w, v;
  int id, x;
};
Bag bag[N];
bool cmp(Bag a, Bag b) {
  return (a.v / a.w) > (b.v / b.w);
}
double bound(int i) {
  double cleft = c - cw;
  double bd = cp;
  while (i <= n && bag[i].w <= cleft) {
    cleft -= bag[i].w;
    bd += bag[i].v;
    i++;
  }
  if (i <= n)
    bd += bag[i].v * cleft / bag[i].w;
  return bd;
}
void dfs(int i) {
  if (i > n) {
    bestp = cp;
    for (int i = 1; i <= n; i++) 
        x[bag[i].id] = bag[i].x;
    return;
  }
  if (cw + bag[i].w <= c) {
    cw += bag[i].w;
    cp += bag[i].v;
    bag[i].x = 1;
    dfs(i + 1);
    cw -= bag[i].w;
    cp -= bag[i].v;
    bag[i].x = 0;
  }
  if (bound(i + 1) > bestp)
    dfs(i + 1);
}
int main() {
  cin >> n >> c;
  for (int i = 1; i <= n; i++)
    cin >> bag[i].w;
  for (int i = 1; i <= n; i++)
    cin >> bag[i].v;
  for (int i = 1; i <= n; i++)
    bag[i].id = i;
  sort(bag + 1, bag + 1 + n, cmp);
  dfs(1);
  cout << bestp<<endl;
  for (int i = 1; i <= n; i++)
    cout << x[i] << " ";
  return 0;
}


目录
相关文章
|
18天前
|
自然语言处理 算法 安全
境内深度合成服务算法备案通过名单分析报告
本报告基于《境内深度合成服务算法备案通过名单》,分析了2023年6月至2025年3月公布的10批备案数据,涵盖属地分布、行业应用及产品形式等多个维度。报告显示,深度合成算法主要集中于经济发达地区,如北京、广东、上海等地,涉及教育、医疗、金融、娱乐等多行业。未来趋势显示技术将向多模态融合、行业定制化和安全合规方向发展。建议企业加强技术研发、拓展应用场景、关注政策动态,以在深度合成领域抢占先机。此分析旨在为企业提供参考,助力把握技术发展机遇。
境内深度合成服务算法备案通过名单分析报告
|
19天前
|
供应链 算法 搜索推荐
从公布的前十一批其他算法备案通过名单分析
2025年3月12日,国家网信办发布算法备案信息,深度合成算法通过395款,其他算法45款。前10次备案中,深度合成算法累计3234款,其他类别647款。个性化推送类占比49%,涵盖电商、资讯、视频推荐;检索过滤类占31.53%,用于搜索优化和内容安全;调度决策类占9.12%,集中在物流配送等;排序精选类占8.81%,生成合成类占1.55%。应用领域包括电商、社交媒体、物流、金融、医疗等,互联网科技企业主导,技术向垂直行业渗透,内容安全和多模态技术成新增长点。未来大模型检索和多模态生成或成重点。
从公布的前十一批其他算法备案通过名单分析
|
28天前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
47 9
 算法系列之数据结构-二叉树
|
26天前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
41 3
 算法系列之数据结构-Huffman树
|
27天前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
66 22
|
19天前
|
人工智能 自然语言处理 供应链
从第十批算法备案通过名单中分析算法的属地占比、行业及应用情况
2025年3月12日,国家网信办公布第十批深度合成算法通过名单,共395款。主要分布在广东、北京、上海、浙江等地,占比超80%,涵盖智能对话、图像生成、文本生成等多行业。典型应用包括医疗、教育、金融等领域,如觅健医疗内容生成算法、匠邦AI智能生成合成算法等。服务角色以面向用户为主,技术趋势为多模态融合与垂直领域专业化。
|
2月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
36 3
|
21天前
|
人工智能 自然语言处理 算法
从第九批深度合成备案通过公示名单分析算法备案属地、行业及应用领域占比
2024年12月20日,中央网信办公布第九批深度合成算法名单。分析显示,教育、智能对话、医疗健康和图像生成为核心应用领域。文本生成占比最高(57.56%),涵盖智能客服、法律咨询等;图像/视频生成次之(27.32%),应用于广告设计、影视制作等。北京、广东、浙江等地技术集中度高,多模态融合成未来重点。垂直行业如医疗、教育、金融加速引入AI,提升效率与用户体验。
|
5月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
72 1
|
3月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
178 77

热门文章

最新文章

  • 1
    局域网屏幕监控系统中的Python数据结构与算法实现
    141
  • 2
    2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
    62
  • 3
    2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    55
  • 4
    2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    58
  • 5
    2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    82
  • 6
    2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    46
  • 7
    2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    83
  • 8
    2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    49
  • 9
    2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    58
  • 10
    2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    55