第一范文网 - 专业文章范例文档资料分享平台

算法设计--普通背包问题与棋盘覆盖问题分析

来源:用户分享 时间:2025/5/28 23:55:13 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

目 录

一、问题描述 ................................................................................................................................... 2

1、普通背包问题: ................................................................................................................. 2 2、棋盘覆盖问题: ................................................................................................................. 2 二、问题分析 ................................................................................................................................... 2

1、普通背包问题: ................................................................................................................. 2 2、棋盘覆盖问题: ................................................................................................................. 3 三、建立数学模型 ........................................................................................................................... 3

1、普通背包问题: ................................................................................................................. 3 四、算法设计 ................................................................................................................................... 4

2、普通背包问题: ................................................................................................................. 4 2、棋盘覆盖问题: ................................................................................................................. 4 五、算法实现 ................................................................................................................................... 5

1、普通背包问题: ................................................................................................................. 5 2、棋盘覆盖问题: ................................................................................................................. 8 六、测试分析 ................................................................................................................................... 9

1、普通背包问题: ................................................................................................................. 9 2、棋盘覆盖问题: ............................................................................................................... 11 七、结论......................................................................................................................................... 12 八、源程序..................................................................................................................................... 12

1、普通背包问题: ............................................................................................................... 12 2、棋盘覆盖问题: ............................................................................................................... 15 九、参考文献: ............................................................................................................................. 16

一、问题描述

1、普通背包问题:

有一个背包容量为C,输入N个物品,每个物品有重量S[i],以及物品放入背包中所得的收益P[i]。求选择放入的物品,不超过背包的容量,且得到的收益最好。物品可以拆分,利用贪心算法解决。

2、棋盘覆盖问题:

在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

二、问题分析

1、普通背包问题:

贪心算法的基本思想是:从问题的某一个初始解出发逐

步逼近给定的目标,以尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。

背包问题用贪心算法来解决,先求出每件物品的平均价值即p[i]/s[i],然后每次选择利润p[i]/s[i]最大的物品装进背包,这样就使得目标函数增加最快,当

2

最后一种物品放不下时,选择一个适当的拆分,使物品装满背包,使得总的价值最大。

2、棋盘覆盖问题:

将2^k x 2^k的棋盘,先分成相等的四块子棋盘,其中特殊方格位于四个中的一个,构造剩下没特殊方格三个子棋盘,将他们中的也假一个方格设为特殊方格。如果是:

左上的子棋盘(若不存在特殊方格)则将该子棋盘右下角的那个方格假设为特殊方格

右上的子棋盘(若不存在特殊方格)则将该子棋盘左下角的那个方格假设为特殊方格

左下的子棋盘(若不存在特殊方格)则将该子棋盘右上角的那个方格假设为特殊方格

右下的子棋盘(若不存在特殊方格)则将该子棋盘左上角的那个方格假设为特殊方格

当然上面四种,只可能且必定只有三个成立,那三个假设的特殊方格刚好构成一个L型骨架,我们可以给它们作上相同的标记。这样四个子棋盘就分别都和原来的大棋盘类似,我们就可以用递归算法解决。

三、建立数学模型

(根据问题情况选择,不需要此步骤可不要)

1、普通背包问题:

求平均价值即p[i]/s[i] 约束条件: c1<=0

3

四、算法设计

2、普通背包问题:

用贪心算法进行设计,贪心算法的基本思想是:从问题的某一个初始解出发逐 步逼近给定的目标,以尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。

int n 物品个数 double C 背包的容量

double s[M] 物品的重量(或大小) double p[M]物品的价值

void average(int n,double s[M],double p[M])//按照价值密度的降序排列函数; double c1 背包剩余容量 totalp 物品的总价值

void bag(int n,double C,double s[M],double p[M],double x[M])求物品总价值的函数 在求物品总价值函数中药调用average函数,在主函数中调用bag()函数。

2、棋盘覆盖问题:

采用分治法设计,分治法的基本思想:分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之。如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。

将2^k x 2^k的棋盘,先分成相等的四块子棋盘,其中特殊方格位于四个中的一个,构造剩下没特殊方格三个子棋盘,将他们中的也假一个方格设为特殊方格。如果是:

左上的子棋盘(若不存在特殊方格)则将该子棋盘右下角的那个方格假设为特殊方格

右上的子棋盘(若不存在特殊方格)则将该子棋盘左下角的那个方格假设为特殊方格

左下的子棋盘(若不存在特殊方格)则将该子棋盘右上角的那个方格假设为特殊方格

4

右下的子棋盘(若不存在特殊方格)则将该子棋盘左上角的那个方格假设为特殊方格

当然上面四种,只可能且必定只有三个成立,那三个假设的特殊方格刚好构成一个L型骨架,我们可以给它们作上相同的标记。这样四个子棋盘就分别都和原来的大棋盘类似,我们就可以用递归算法解决。

tr: 棋盘左上方格行号; tc:棋盘左上方格列号; dr:特殊方格所在行号; dc:特殊方格所在列号; size:棋盘规格2k×2k

五、算法实现

1、普通背包问题:

(1)实现了按照价值密度的降序排列: void average(int n,double s[M],double p[M]) {int i,j;

double temp1,temp2,temp3,c[M]; for(i=1;i<=n;i++) c[i]=p[i]/s[i]; for(i=1;i

{ temp1=p[j];p[j]=p[j+1];p[j+1]=temp1; temp2=s[j];s[j]=s[j+1];s[j+1]=temp2; temp3=c[j];c[j]=c[j+1];c[j+1]=temp3; } };

5

算法设计--普通背包问题与棋盘覆盖问题分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c7bk6q2ylug5v45r563in_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top