[算法]92年全国数模大赛试题的计算机解法[上]

最近正在接受数模班的超高强度培训,原来遵循的还是临时磨枪,不快也光的培训准则啊~~~~

92年全国数模大赛试题有一题是这样的:

组成生命蛋白质的若干种氨基酸可以形成不同的组合。通过质谱实验测定分子量来分析某个生命蛋白质分子的组成时,遇到的首要问题如何将它的分子量X(正整数)分解为n个氨基酸的已知分子量之和。某实验研究所研究的问题中,n=18,
a[1:18]={57,71,87,97,99,101,103,113,114,115,128,129,131,137,147,156,163,186}
给定某以蛋白质的分子量X(x=<1000)为正整数 。要求对该实验室拥有或不拥有计算机的情况作出解答。
我只节选了拥有计算机的情况的求解,里面的生物学相关部分由我们小组成员Luna Huang完成.

习作论文下载地址:

http://emilmatthew.51.net/lunwen1.rar

主要的想法就是用一棵搜索树来决定搜索的区间,我一时间也没有细想,用了n叉树,算法效率当然变得很低了.

还有关于这个算法的复杂度分析也一定不正确,希望大家给出点好的改进意见并指出不足.

算法部分简摘如下.(有些用公式编辑打的东东可能没有及时补上,希谅解,可以下word原文)

本问题可以抽像成下面这个算法模型:

 

       给定一个序数字序列a[1…n],可以从中选出任意个数进行组合(如某组合为c[j]={a[i1],…,[im]}).序列a中的同一个数允许重复选择且重复次数没有限定.每个组均要满足一定的约束条件.

 

算法的组合依据:

 

如果按照遍历出序列中所有满足条件的组的思路,显然,这就是一个和组合相关的题目,不妨先假定对于升序的数字序列a[1-3], 从中选出任意个数组合成组.约束条件为:每个组的元素之和<=某个上限值X.既然元素是可以重复选择,很容易想到下面这个思路.

 

1)由于是和排列的位置无关,所以,先找出序列a[1…n]中所有有a[1](a[1]允许重复)的组的情况:

 

一个元素:a[1]

 

两个元素:a[1]a[1],a[1][2]…,a[1]a[3]

 

       三个元素a[1]a[1]a[1], a[1]a[1]a[2] , a[1]a[1]a[3],a[1]a[2]a[1],…,a[3]a[3]a[3]

 

       ….

 

每个组停止继续扩展的条件为假设中的约束条件.

 

:a[1]+a[1]+a[1]>L,a[1]a[1]a[1]组就不可能扩展更多的组了(因为序列是升序排列的),因而停止扩展.

 

又若a[1]a[1]a[2]<=L,a[1]a[1]a[2]组就还能扩展出更多的组,

 

a[1]a[1]a[2]a[2],a[1]a[1]a[2]a[3]

 

2)接下来,是在剩余的所有满足约束条件的组中找出有含有a[2]的组,由于前面已找完了所有有a[1]的组情况,所以,这里不用再考虑a[1].

 

一个元素:a[2]

 

两个元素:a[2]a[2],a[2][3],…,a[2]a[n]

 

       三个元素a[1]a[1]a[1], a[1]a[1]a[2] , a[1]a[1]a[3],a[1]a[2]a[1],…,a[3]a[3]a[3]

 

       ….

 

每个组停止继续扩展的条件同上.

 

3)最后是a[3]: 由于前面已找完了所有有a[1],a[2]的组情况,所以,这里不用再考虑a[1],a[2].

 

一个元素:a[3]

 

两个元素:a[3]a[3]

 

       三个元素a[3]a[3]a[3]

 

      

 

       a中的元素个数为n,可按同样的原理使其中的元素成组.

 

      根据组合中的知识,可以肯定,这样的搜索方式,可以完全的将所有的情况遍历到.这是下面算法正确的前提.而由n个元素的成组情况依赖于n-1个元素的成组情况,可以很容易的看出,这样的关系可以完全的用一棵搜索树来表示.于是,有了下面的算法思路.

 

 

 

3算法思路

 

假设约束条件同上,将序列a[1-3]改成a[1…n].

 

1).首先,要保证这是一个按升序排列的序列(可用一个排序算法实现),这是实现本算法的前提.因为约束条件上限的给定是必须的,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值