IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 装载问题(回溯法) -> 正文阅读

[数据结构与算法]装载问题(回溯法)

装载问题(回溯法)


类似01背包问题,可以用动态规划,但有时候使用回溯法会更加高效。

#include<iostream>
#include<iomanip>
#define GOODS_NUM 4
using namespace std;

/**
* 2021.12.15
* 装载问题
* 迭代回溯,省去O(n)递归栈空间
* 时间复杂度:O(2^n)
*/

/**
* @param w[] 货物的重量数组
* @param c 一艘船的最大限重量
* @param n 货物的数量
* @param bestx[] 最优载重量的解,装了第i个货物则bestx[i]=1;否则bestx[i]=0
*/
template<class Type>
Type maxLoading(Type w[], Type c, int n, int bestx[]) {//迭代回溯法
	//返回最优载重量及其相应解,初始化根节点
	int i = 1;//当前层,从1开始,而非0
	int* x = new int[n + 1];//x[1:i-1]为当前路径。不考虑下标0,所以开辟n+1个空间。
	Type bestw = 0,//最优载重量
		cw = 0,//当前载重量
		r = 0;//剩余载重量
	for (int i = 1; i <= n; i++) {
		r += w[i];//初始化剩余载重量
	}
	while (true) {//搜索子树
		while (i <= n && cw + w[i] <= c) {//进入左子树
			r -= w[i];
			cw += w[i];
			x[i] = 1;
			i++;
		}
		if (i > n) {//到达叶节点,由于有剪枝回溯,保证每次到达叶节点一定会更新最佳路径
			for (int j = 1; j <= n; j++) {
				bestx[j] = x[j];
			}
			bestw = cw;
		}
		else {//进入右子树
			r -= w[i];
			x[i] = 0;
			i++;
		}
		while (cw + r <= bestw) {//剪枝回溯,cw+r为当前重量和接下来的所有集装箱之和,即当前的最大可能
			i--;
			while (i > 0 && !x[i]) {//*****不明白这一步的意思
				r += w[i];//只要i要发生变化了,r就会一起发生变化
				i--;
			}
			if (i == 0) {
				delete[] x;
				return bestw;
			}
			//进入右子树
			x[i] = 0;
			cw -= w[i];
			i++;
		}
	}
}

int main() {
	int w[GOODS_NUM+1] = { -1,10,30,40,20 },
		c = 70,
		* bestx = NULL,
		bestw;
	bestx = new int[GOODS_NUM + 1];
	bestw = maxLoading(w, c, GOODS_NUM, bestx);
	cout << "bestw:" << bestw << endl;
	for (int i = 1; i <= GOODS_NUM; i++) {
		cout << setw(3) << w[i];
	}
	cout << endl;
	for (int i = 1; i <= GOODS_NUM; i++) {
		cout << setw(3) << bestx[i];
	}
	delete[] bestx;
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:56:08  更:2021-12-16 17:58:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:43:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码