深入理解数据结构——堆栈应用(背包体积)

2023-11-08

#include <iostream>
#include <string>

using namespace std;



typedef char Etype;

/************************背包问题*************************/
#define PRODUCTS EType

struct PRODUCTS {
	char name[8];
	int weight;
	int number;
	char place[20];
};



struct LinearList {
	EType* element;
	int length;
	int maxsize;
};

struct SType {
	int index;
};

struct Stack {
	SType* element;
	int top;
	int maxsize;
};



//创建空堆栈
void CreateStack(Stack& S, int MaxStackSize) {
	S.maxsize = MaxStackSize;
	S.element = new SType[S.maxsize];//创建数组元素
	S.top = -1;//top指向的是数据空间的第一个元素,本身的值代表数据元素的下表,空表设top为-1
}

//判断堆栈是否为空
bool IsEmpty(Stack& S) {
	if (S.top == -1) return true;
	else return false;
}

//判断堆栈是否满了
bool IsFull(Stack& S) {
	if (S.top >= S.maxsize - 1) return true;
	else return false;
}

//返回栈顶元素的值
bool GetTop(Stack& S, SType& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	return true;
}

//出栈操作,将栈顶元素取出,并且将top指向下一个元素的位置
bool Pop(Stack& S, SType& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	S.top--;//栈顶指向下一个元素地址
	return true;
}

//进栈操作,将top+1,输入元素存入新的栈顶
bool Push(Stack& S, SType& x) {//传入的是x的地址
	if (IsEmpty(S)) return false;
	S.top++;
	S.element[S.top] = x;
	return true;
}



void TraverseStack(Stack& S, LinearList& L) {
	//逐个输出堆栈的数据元素
	int k;
	for (int i = S.top; i > -1; i++) {
		cout << "Record-" << i + 1 << ":";
		k = S.element[i].index;
		cout << L.element[k].number << " " << L.element[k].weight << endl;
	}
	cout << "该方案有:" << S.top + 1 << "件货物" << endl << endl;

}
void Knapsack(LinearList& L, int T) {
	//T为背包体积,n个物品的体积存在w[]中,求解装满背包的所有解
	int k;
	int MaxStackSize = 50;
	SType x;
	Stack S;

	CreateStack(S, MaxStackSize);

	do {
		while (T > 0 && k < L.length) {
			if (T - L.element[k].weight >= 0) {//按顺序选取物品,如果装入背包不满,则将物体压入堆栈
				x.index = k;
				Push(S, x);//把满足条件的背包压入S
				T = T - L.element[k].weight;//背包体积减去这个物体体积
			}
			k++;//继续选择下一个物体
		}//堆栈S中是已装入背包的物体
		if (T == 0)  TraverseStack(S, L);//如果经过一轮循环,,就输出栈中所有的物品编号
		Pop(S, x);//推出栈顶数据
		k = x.index;//从退出的编号的下一个编号物品开始尝试,直到堆栈为空,达到最大编号为止
		T = T + L.element[k].weight;
		k++;
			
	} while (!IsEmpty(S));


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解数据结构——堆栈应用(背包体积) 的相关文章

  • 在c++中定义一堆静态方法

    哪个是合适的 class xyz static int xyzOp1 static int xyzOp2 OR namespace xyz static int xyzOp1 static int xyzOp2 当我们使用类标签与命名空间标
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 在编译输出中添加程序集绑定 (app.config)

    如果我编译应用程序 则会在输出中自动添加程序集绑定 具体的程序集绑定不在app config在 Visual Studio 中但在创建的应用程序配置中 有什么办法可以检查为什么会自动添加程序集绑定吗 选项AutoGenerateBindin
  • 我想找到 C# 代码中所有后面没有括号的 if 语句。通过正则表达式

    我想找到所有if声明和for后面没有大括号的语句 当你在一个文件中写入一行时if声明您大多不会将其括在大括号中 所以我想找到所有这些if and for声明 请帮忙 就像我想捕捉这个声明 if childNode Name B return
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 如何使用 itextsharp 更改 PDF 公式的按钮图标?

    我目前正在尝试使用 itextsharp 填写预定义的表单 除了添加图像之外 一切正常 这之前已经在 Adob e 的 FDF 工具包中运行过 该工具包已编译为 NET 1 1 这不再适用于 NET 4 0 我改用了 itextsharp
  • 如何通过分解 y 轴来减小 mschart 的高度

    如何降低 mschart 的高度 如下所示 编辑 就我而言 我不想查看中断图表 this chart1 ChartAreas 0 AxisY ScaleBreakStyle Enabled false 您似乎正在寻找AxisY ScaleB
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • UnitTest单元测试框架解析【实用篇】

    UnitTest是展开自动化测试的基础 这个框架很重要 首先我们先自己写一个测试类 1 被测试类 Widthget py coding utf 8class Widthget def init self size 10 10 self si
  • 常用的正则表达式总结(慢慢增加中。。。)

    1 0 100 内的数字 不包含0 100 排除0 0 0 00 保留三位小数 1 9 1 2 d 1 3 0 0 9 1 2 1 9 2 0 100 内的数字包含0 100 保留三位小数 d 1 2 d 1 3 100
  • Java将jar包打成exe包

    如何获取jar包 1 如果是maven项目 2 如果是SpringBoot项目 添加maven插件 直接使用maven插件进行打包 Jar打包成exe 准备 相关的jar Exe4j应用程序 地址 https www ej technolo
  • 第三届Python数据分析职业技能比赛A题

    第三届Python数据分析职业技能比赛A题 Hello World 赛题 竞赛背景 字段说明 考核目标 任务 任务一 数据预处理 任务二 数据可视化 任务三 数据分析 任务一思路 1 2 1 3 任务二思路 2 1 2 2 2 3 任务三思
  • 禅道程序员的10条原则

    在一个阴雨的早上 我坐在桌子旁 开始想如何才能高效的工作 在我成为一个自由职业者之前 我有很长一段时间都很努力工作 但收效甚微 我在2006开始接触禅学 我马上意识到 古代的禅宗大师们几百年前早就已经知道现今的程序员应该如何工作 虽然我很讨
  • 如何通过官方渠道下载任意版本的Spring相关的jar包

    1 进入官网http spring io 2 第二步 点击PROJECTS 3 点击SPRING FRAMEWORK 4 点击上一步中GitHub图标 进入下面的页面 第五步 把第四步出现的页面往下拉 找到 Spring Framework
  • python Matplotlib画图之调整字体大小的示例

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 本篇文章主要介绍了python Matplotlib画图之调整字体大小的示例 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 一张字体调整好的示
  • 不能在slot上绑定和触发事件

    在 slot 上进行事件的监听和分发 这是不可能的 组件的 slot 由调用它的父组件提供 这意味着所有事件都应该与父组件相关联 尝试去倾听这些变化意味着你的父子组件是紧密耦合的 可以使用 parent 来操作 div div
  • 5.1广度优先遍历的递归与迭代实现;

    队列先进先出的性质 符合 广度优先遍历时 一层一层的遍历逻辑 lc102 102 二叉树的层序遍历 107 二叉树的层次遍历II 199 二叉树的右视图 637 二叉树的层平均值 429 N叉树的层序遍历 515 在每个树行中找最大值 11
  • 谭铁牛:人工智能 找风口不如找关口

    不过我们不能光打打嘴炮 如何克服困难和挑战 让人工智能帮到你的工作 你的事业呢 让我们将李开复的演讲内容 再结合一个实例 来给大家解释一下 现在 假设你是一个程序员 虽然哥也是一媒体人 但黑起自己的行业来是丝毫不会手软的 假设你现在是一家媒
  • Python库

    库名称简介 Chardet字符编码探测器 可以自动检测文本 网页 xml的编码 colorama主要用来给文本添加各种颜色 并且非常简单易用 Prettytable主要用于在终端或浏览器端构建格式化的输出 difflib Python 标准
  • openwrt添加自己的应用程序(SDK下编译模块)出现的问题

    openwrt 版本 15 05 CC 最近在openwrt里面想编写一个串口的读写程序 没想到会出现以下问题 1 编译的时候 以下为网友遇到的问题 Package helloworld is missing dependencies fo
  • GetProcAddress()方法返回NULL值的问题

    使用动态加载的方式使用动态库 loadlibrary 成功加载动态库 之后使用GetProcAddress 方法得到函数指针却返回空值 使用GetLastError 方法得到错误代码127 出现此错误的原因一般是要加载的函数名称与动态库中函
  • 外部中断原理

    外部中断 当CPU正在按主程序运行时 外部发生了紧急事件 向CPU发送中断请求来优先处理紧急事件 当CPU处理完紧急事件后再继续从主程序断开的地方运行程序 发出中断请求的源称为中断源 不同的中断源具有不同的优先级别 当CPU同时接收到多个中
  • C++实现WebSocket简单服务器

    参考链接 链接1 链接2 链接3 WebSocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 在WebSocket
  • javaday09面向对象---简单谈

    Java day09 面向对象 一 成员变量和局部变量的区别 局部变量是没有默认值的 还有一个是 4 内存的位置不同 5 生命周期不同 二 内存图 形参为引用类型时 继续执行 调用function 压栈执行 以前说的是数组是引用类型 现在要
  • Boost建模与仿真 1MW设计

    这里讲一下BOOST电路从建模到系统实现 为了方便DSP移植性 所以采用离散仿真加s function C代码编写的程序 Boost 电路设计 主要仿真功率为1MW的Boost电路 主回路拓扑 Boost硬件参数选型 电容C 50000uf
  • Error: Cannot find module ‘@/views/xxx‘ at webpackEmptyContext

    从开源平台上面 clone 一个vue 项目时 登陆后 一直报找不到相对应的 module 搜了很多 后面终于解决 export const loadView view gt return gt import views view 改成如下
  • (Java)leetcode-85 Maximal Rectangle(最大矩形)

    题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵 找出只包含 1 的最大矩形 并返回其面积 示例 输入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出 6 思路整理自windliang的题解 思路
  • 深入理解数据结构——堆栈应用(背包体积)

    include