基于李春葆老师主编的《算法设计与分析》有关用回溯法求解装载问题的分析

上机实验题7——求解装载问题

       有 n 个集装箱要装上一艘载重量为 W 的轮船,其中集装箱 i(1<=i<=n)的重量为 wi 。在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船,当总重量相同时要求选取的集装箱个数尽可能少。编写一个实验程序采用回溯法求解。要求采用适当的剪枝条件提高效率,左孩子结点剪枝的条件是只装载满足重量要求的集装箱,右孩子结点剪枝 的条件是至少要选 3 个集装箱。
       例如,n = 5, W = 10, w = {5, 2, 6, 4, 3}时,其最佳装载方案是(0, 0, 1, 1, 0), 即装载第3、4个集装箱。

分析

       假想存在一颗二叉树,每一层的结点对应已考虑 i 个集装箱后选取的集装箱的总重量。每一条边的值为 0 或 1 对应是否选择第 i 个集装箱。
       根节点值为 0 ,代表最初还没有开始选择集装箱的状态。
       对于第 i 个要装入的集装箱分两种情况。如果将其装入,相当于走了左子树,此时左孩子的结点值为父结点值加上第 i 个集装箱的重量。如果不将其装入,相当于走了右子树,此时右孩子的结点值和父节点值相等。
       上面相当于是假想了一个完全二叉树,接下来要进行剪枝。
       左剪枝是对于左孩子结点的剪枝,当装载的集中箱总重量大于 W ,说明找到了一个可行解(不一定是最优解),所以不需要再走左子树,要走右子树。
       右剪枝是对于右孩子结点的剪枝。如果装载的集中箱数量加下剩余的集装箱数量小于 3 ,说明此次选择不可能选够 3 个集装箱,所以不再进行右子树的搜索。
       如果i>n说明已经走完了叶子结点即已经考虑了 i 个集装箱,这是一个可行解。如果集装箱的总重量大于最优解的集装箱总重量或者集装箱的总重量等于最优集装箱总重量且比最优集装箱数量少,说明它可能是新的最优解,需要将其赋给最优解。

代码

# include<stdio.h>
# define MAXN 20	//最多集装箱个数
int n, W;
int maxw;	//存放最优解的总重量 
int x[MAXN];	//存放最优解向量 
int minm = 32767;	//存放最优解的集装箱个数,初值为最大值 

void Loading(int w[], int tw, int m, int r, int op[], int i)//考虑第i个集装箱
{
	//tw为考虑第i个集装箱时装入的总重量,其装载解向量为op
	int j;
	if(i > n)	//找到一个叶子节点 
	{	if(tw <= W&&(tw > maxw||(tw==maxw && m<minm)) && m>=3)
		//找到一个满足条件的更优解,保存它
		{
		maxw = tw;
		minm = m;
		for(j = 1 ;j <= n; j++)
			x[j] = op[j];
		}
	
	}
	else
	{	//尚未找完所有物品 
		op[i] = 1;	 //选取第i个集装箱 
		if(tw+w[i] <= W)//左孩子结点剪枝:装载满足条件的集装箱 
		{
			Loading(w, tw+w[i], m+1, r-1, op, i+1);
		}
		op[i] = 0;	//不选取第i个集装箱,回溯 
		if(r+m >= 3)//右孩子结点剪枝 :至少要选3个集装箱 
			Loading(w, tw, m, r, op, i+1);
	}
}


void dispasolution(int n)	//输出一个解 
{
	int i;
	printf("选取的集装箱:\n");
	for(i = 1; i <= n; i++)
		if(x[i] == 1)
			printf("选取第%d个集装箱\n", i);
	printf("总重量=%d\n", maxw);
}

int main()
{
	int w[] = {0,20,3,5,2,6,4,3,9};	//各集装箱重量,不用下标0的元素 
	int op[MAXN];	//存放临时解 
	n = 8, W = 20; //n是集装箱的个数,W是集装箱总重量,
	int r = n;	//r是集装箱剩余数量初始值为n 
	Loading(w, 0, 0, n, op, 1);
	dispasolution(n);
	return 0;
}



  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《算法设计与分析李春葆pdf》是由李春葆所编著的一本关于算法设计与分析的参考书籍,该书以系统全面的方式介绍了算法设计与分析的相关概念、技巧和方法。 该书第一部分主要介绍了算法与问题求解的基础知识,包括算法的基本概念、时间复杂度和空间复杂度等。作者通过具体的例子和细致的讲解,帮助读者理解算法的定义和性质,以及了解如何评估算法的效率。 第二部分以常见的算法设计技巧为核心,详细阐述了递归算法、贪心算法、动态规划算法和回溯算法等。这些算法设计技巧在实际问题求解中经常使用,对于提高算法的效率和准确性非常要。通过学习这些技巧,读者可以了解到不同算法设计背后的思维方式和解题思路,进而在实践中灵活运用。 第三部分主要介绍了图论算法和字符串匹配算法,这些算法在计算机科学领域有着广泛的应用。通过学习这些算法,读者可以掌握图的基本概念、图遍历算法、最短路径算法等,并了解字符串匹配算法的原理和应用。 除了算法设计和分析的内容外,该书还提供了大量的习题和实例,方便读者巩固所学知识和提升解题能力。通过解答习题和实践训练,读者可以更好地理解算法设计与分析的思想,提高自己的算法水平。 总之,《算法设计与分析李春葆pdf》是一本全面系统介绍算法设计与分析的优秀参考书籍,适合计算机科学及相关专业的学生和从业者阅读学习。无论是初学者还是有一定算法基础的人士,都能够从中获取到丰富的知识和实践经验,提高自己的算法设计与分析能力。 ### 回答2: 《算法设计与分析李春葆.pdf》是一本由李春葆编写的算法设计与分析的教材。本书总共分为七个章节,内容包括基础知识、排序算法、查找算法、图算法、动态规划、贪心算法和分治算法。 第一章介绍了算法设计和分析的基础知识,包括算法的定义、性质和分类方法,以及算法分析的基本原理和方法。这些基础知识为后面的章节打下了坚实的基础。 第二章介绍了常见的排序算法,包括插入排序、选择排序、冒泡排序、快速排序、归并排序等。每种排序算法都给出了详细的算法步骤和时间复杂度分析,帮助读者理解算法的原理和性能。 第三章讲解了查找算法,包括线性查找、二分查找、哈希查找等。每种查找算法都给出了具体的实现步骤和时间复杂度分析,帮助读者掌握不同查找算法的优缺点和适用场景。 第四章介绍了图算法,包括图的遍历算法、最短路径算法、最小生成树算法和拓扑排序算法等。每种图算法都给出了解题思路和详细的算法步骤,帮助读者理解和解决图相关问题。 第五章介绍了动态规划算法,这是一种处理具有叠子问题和最优子结构性质的问题的有效方法。本章详细介绍了动态规划的原理和方法,并给出了具体的应用例子,帮助读者掌握动态规划的解题思路。 第六章介绍了贪心算法,这是一种通过每一步的局部最优选择来达到全局最优的方法。本章给出了贪心算法的定义和基本思想,并通过具体的案例和算法实现来讲解贪心算法的应用。 第七章介绍了分治算法,这是一种将问题分解为多个子问题,再将子问题的解合并得到原问题解的方法。本章详细讲解了分治算法的基本思想和应用,通过具体的案例和算法实现帮助读者理解分治算法的原理。 通过阅读《算法设计与分析李春葆.pdf》,读者可以全面了解算法设计与分析的基础知识和常用算法的原理和应用。这本教材用简明易懂的语言讲解了复杂的算法原理,并通过详细的算法步骤和示例帮助读者掌握算法的设计和分析方法。无论是计算机专业的学生还是从事算法研究和开发的工程师,都可以从这本教材中受益。 ### 回答3: 《算法设计与分析》是由李春葆编写的一本介绍算法设计与分析的教材。该教材主要从理论和实践两个方面来解释算法的设计和分析方法。 首先,该教材从理论层面介绍了常见的算法设计方法,如贪心算法、动态规划、分治算法等。这些方法能够帮助读者理解和掌握算法的基本原理和思想。同时,该教材还介绍了各种算法的时间复杂度和空间复杂度的分析方法,使得读者能够评估和比较不同算法的效率和性能。 其次,该教材注实践环节,通过大量的示例和练习题,帮助读者加深对算法设计和分析的理解与应用。在实践环节中,读者不仅能够了解常见算法的实现过程,还能学会如何调试和优化算法,提高算法的效率和准确性。 此外,该教材还涵盖了一些高级算法的设计和分析,如图算法、字符串算法等。这些高级算法在实际应用中具有要作用,通过学习这些算法,读者可以了解到更多领域的算法设计和分析方法。 总的来说,李春葆编写的《算法设计与分析》是一本内容丰富、理论联系实际的教材。无论是对于算法初学者还是对于有一定算法基础的人来说都是一本很好的参考书,可以帮助读者深入理解算法设计和分析的思想和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值