装载问题

计算机算法设计与分析——装载问题

问题描述:
有一批共n 个集装箱要装上艘载重量为c1、c2的两个船上,找出一种最优装载方案,将尽可能重的集装箱装上轮船。
解题思路:
先尽可能的将c1船装满,剩下的装进c2中
主要代码段:

void Backsort(int i)
{
	if (i > n)   //判断是否达到子节点
	{
		if (n_weight > best_weight)   // 如果当前解大于最优解,则对最优解进行更新
		{
			for (int i = 1; i <= n; ++i)
			{
				best[i] = x[i];			 //同时更新最优解集,标记为1
			}
			best_weight = n_weight;    
		}
		return ;
	}
	r -= weight[i];    //如果编号为 i 物品装进去,需要将它重量减掉

	if (n_weight + weight[i] <= c1)  //已经装进去的重量加上第 i 个物品的重量,如果小于c1的载重,则表示可以装进去
	{
		n_weight += weight[i];
		x[i] = 1;
		Backsort(i + 1);
		x[i] = 0;
		n_weight -= weight[i];
	}
	if (n_weight + r  > best_weight)   //剪枝
	{
		x[i] = 0;
		Backsort(i + 1);
	}
	r += weight[i];
}

用于判断在将c1装满时,剩余的重量c2是否可以装下

int res = 0;
	for (int i = 1; i <= n; ++i)
	{
		if (best[i] == 0)
			res += weight[i];
	}
	if (res > c2)
	{
		cout << "装不下" << endl;
	}

代码演示:

#include<iostream>

using namespace std;

int n;//集装箱数量
int c1, c2;//船1,2的容量
int n_weight ;//当前装入
int best_weight;//最优载重
int x[10];//判断是否装入
int weight[10];//集装箱重量
int r;//剩余集装箱总重量
int best[10];//最优装入

void output()
{
	int res = 0;
	for (int i = 1; i <= n; ++i)
	{
		if (best[i] == 0)
			res += weight[i];
	}
	if (res > c2)
	{
		cout << "装不下" << endl;
	}
	else
	{
		cout << "C1装的物品";
		for (int i = 1; i <= n; ++i)
		{
			if (best[i] == 1)
				cout << i<<" ";
		}
		cout << endl;
		cout << "C2装的物品" ;
		for (int i = 1; i <= n; ++i)
		{
			if (best[i] != 1)
				cout << i<<" ";
		}
	}
}

void Backsort(int i)
{
	if (i > n)
	{
		if (n_weight > best_weight)    
		{
			for (int i = 1; i <= n; ++i)
			{
				best[i] = x[i];     
			}
			best_weight = n_weight;
		}
		return ;
	}
	r -= weight[i];

	if (n_weight + weight[i] <= c1)
	{
		n_weight += weight[i];
		x[i] = 1;
		Backsort(i + 1);
		x[i] = 0;
		n_weight -= weight[i];
	}
	if (n_weight + r > best_weight)
	{
		x[i] = 0;
		Backsort(i + 1);
	}
	r += weight[i];
}
int main()
{
	void input()
{
	r = 0;
	n_weight = 0;
	best_weight = 0;
	cout << "请输入集装箱数量" << endl;
	cin >> n;
	cout << "请输入船的容量" << endl;
	cin >> c1 >> c2;
	cout << "请输入集装箱重量" << endl;
	for (int i = 1; i <= n; ++i)
	{
		cin >> weight[i];
		r += weight[i];
	}
	Backsort(1);   // 从第一个节点开始便利
	output();
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值