ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

装载问题(回溯法)

2021-05-03 11:02:43  阅读:196  来源: 互联网

标签:问题 Loading Backtrack int bestw 装载 bestx 回溯 cw


 

 

#include<iostream>
using namespace std;


class Loading {
friend int MaxLoading(int* w, int c, int n, int* bestx);
private:
void Backtrack(int i);
int n;//集装箱数
int* x;//当前解
int* bestx;//当前最优解
int* w,//集装箱重量数组
c,//第一艘轮船的载重量
cw,//当前载重量
bestw,//当前最优载重量
r;//剩余集装箱载重量
};
void Loading::Backtrack(int i){
//搜索第i层结点
if (i > n) {
//到达叶结点
if (cw > bestw) {
for (auto j = 1; j <= n; j++)
bestx[j] = x[j];
bestw = cw;
}
return;
}
//搜索子树
r -= w[i];
if (cw + w[i] <= c) {
//搜索左子树
x[i] = 1;
cw += w[i];
Backtrack(i + 1);
cw -= w[i];
}
if (cw + r > bestw) {
//搜索右子树
x[i] = 0;
Backtrack(i + 1);
}
r += w[i];
}

int MaxLoading(int* w, int c, int n, int* bestx) {
//返回最优装载重量
Loading X;
//初始化X
X.x = new int[n + 1];
X.w = w;
X.c = c;
X.n = n;
X.bestx = bestx;
X.bestw = 0;
X.cw = 0;
//初始化r
X.r = 0;
for (auto i = 1; i <= n; i++)
X.r += w[i];
X.Backtrack(1);
delete[]X.x;
return X.bestw;
}
int main()
{
Loading X;
int* w = new int[6];
int c = 80;
int n = 5;
int* bestx = new int[6];
for (int i = 1; i <= 5; i++)
cin >> w[i];
cout<<MaxLoading(w, c, n, bestx)<<'\n';
for (int i = 1; i <= 5; i++) {
cout << bestx[i] << " ";
}

}
/*
10 20 30 40 50
*/

标签:问题,Loading,Backtrack,int,bestw,装载,bestx,回溯,cw
来源: https://www.cnblogs.com/msboke/p/14727106.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有