算法-回溯法解装载问题

这篇博客探讨了一种使用深度优先搜索(DFS)策略来解决在不考虑体积限制的情况下,如何将最重的集装箱优先装上载重量有限的轮船,以达到最大限度利用船舱载重的问题。通过递归的回溯方法,找出最优装载方案,并展示不同起始点装载的序列和最大重量。
摘要由CSDN通过智能技术生成

有一批共n个集装箱要装上艘载重量为c的轮船,

其中集装箱i的重量为wi。

找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,

---将尽可能重的集装箱装上轮船。

/*
有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。
*/

#include <stdio.h>
#include <iostream>
#define num 10
using namespace std;

int c1 = 0,c1x[num] = {0};          // 船舱 的 载重(后面通过 用户 录入) 和 选择 物体 序列  
int w[num] = {1,3,4,6,7,8,2,4,3,1}; //模拟 的 物体 重量 数据 
int bestw = 0;                      //在该 情况 下 的最大重量 (随 着 起始遍历点 选择 不同 而 不同) 

//函数 中间量  
int x[num] = {0};                   //c1x 的中间量 
int current_weight = 0;             //bestw 的中间量 


//采用 dfs 深度 遍历数据,之前 遍历的 数据 排除 在下一次 遍历外 
void BackTrace(int t) 
{
	if(t >= num)
	{
		
		for(int i = 0;i < num;i ++)//标记 
		{
			c1x[i] = x[i];
		}
		bestw = current_weight;     //取得本次 情况 的最大重量 
		return;
	}
	
	if(w[t] > c1)
	{
		BackTrace(t + 1);
		return;
	}
	else
	{

		c1 = c1 - w[t];
		current_weight = current_weight + w[t];
		x[t] = 1;
		BackTrace(t + 1);
		//处理完毕 弹出 栈,还原 变量 
		current_weight = 0;
		c1 = c1 + w[t];
		x[t] = 0;
	
	}
	return;
}

//主函数 
int main()
{
	
	while(1)
	{
	    int end_bestw = 0;//记录 最终 船舱 最大重量 
		printf("cabin weight: ");
		
		scanf("%d",&c1); //输入 船舱的 载重 
		
		for(int i = 0;i < num;i ++)//选择 以 不同的 顶点 为根节点 进行回溯,之间选过的 数据不在 排除考虑 剪切 
		{
			bestw = 0;c1x[num] = {0};//初始化 
			
			BackTrace(i);//开始回溯 入口 
			
			printf("当从第%d个货物开始装时, bestw :%d\n序列:",i + 1,bestw);
			for(int j = 0;j < num;j ++)//打印 每种 情况 下 的 序列  
			{
				printf("%d ",c1x[j]);
			}
			
			if(bestw >= end_bestw)//在每个情况最大重量 中选出 所有情况中 最大的重量 
			{
				end_bestw = bestw;
			}
			cout << endl << endl;
		}
		cout << "最大重量: " << end_bestw << "\n" << endl;	
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值