有四种不同的分子,a,b是单原子分子,c,d是双原子分子。给出构成这四种分子的原子质量。用这四种分子构成一个元素,给定元素质量,求最多可以用多少个分子。
思路:其实机器解题和人解题是一个思路,遇到这种问题,人怎么解决呢。就是尝试。
这里有两个算法思想:动态规划和贪心算法。
动态规划:将问题分部分解决,且最好前面被解决的问题能够被后面多次使用,那就把前面解决了的问题结果存起来,以备后面使用,从而提高效率。
贪心算法:每次先试最有可能出现解的路径。PS;事实上,我在生活中非常不会使用贪心算法。比如去找一本书,命名觉得最有可能在第三层,确要从第一层找起,这样做事效率就低。改正之~编程反过来能启发生说。
这个问题可以写为f(a,b,c,d,x)
a,b,c,d分别为四种分子的质量,x为待合成的化合物的质量。
那么f(a,b,c,d,x) = f(a,b,c,d,x - a) + 1 或者=f(a,b,c,d,x - b) + 1 或者=f(a,b,c,d,x - c) + 1 或者=f(a,b,c,d,x - d) + 1
那么f(a,b,c,d,x - b)是不是也可以按照以上方法分解了呢,直到最后发现x为0了,那么恭喜,试出来一个,如果小于0了,那不行,得重新试。
聪明的你应该发现,递归就可以解决问题
以上就是遍历,如果用一个全局变量记录结果,会知道最大会返回多少,那就是解。
但是我们用贪心,先将,a,b,c,d进行排序,先对质量小的进行递归,那么,是不是第一个被试出来来的,就是解呢。这样计算量就会大大降低。
如果这个题改成最多能有多少个原子,会复杂一点,因为要建立分子质量和原子数(或者原子质量)之间的hash表,用multimap就可以解决。这样做的目的是为了能够排序,实现贪心。
注意:不能用map,因为不允许键值相同的元素出现。
下面贴出最多原子数的代码:
#include
#include