先上题目:
地产大亨Q先生临终遗愿是:拿出100万元给X社区的居民抽奖,麻烦的是,他有个奇怪的要求:
1.100万元必须被正好分成若干份(不能有剩余)。每份必须是7的若干次方元。
比如:1元,7元,49元,343元,……
2.相同金额的份数不能超过5份。
3.在满足上述要求的情况下,分成的份数越多越好!
请你帮忙算一算,最多可以分为多少份?
一、OK,说一下我一开始的解题思路(错误),利用枚举:
1. 先将7的若干次方元排列出来,.append进一个数组tmp,然后在给所有7前面能够满足xi*i<=100w的所有情况全列出,然后sum一个各种情况下的xi的和
2.将sum搞成一个新数组
3.对于sum这个数组进行排序算法。
但是后面我和学校里边一个老师交流后,被批判说这个思路完全不是计算机思维,完全不可行。
这边因为是错误的,代码就不放了。我自己也是没跑出来结果。
因此我又想出如下办法。
二、暴力法
对于x1~x8进行八次嵌套循环,然后将满足条件的情况直接执行max()。
放代码:
value = [1,7,49,343,2401,16807,117649,823543]
sum = 1000000
res = 0
for x0 in range(6):
for x1 in range(6):
for x2 in range(6):
for x3 in range(6):
for x4 in range(6):
for x5 in range(6):
for x6 in range(6):
for x7 in range(6):
if x0*value[0]+x1*value[1]+x2*value[2]+x3*value[3]+x4*value[4]+x5*value[5]+x6*value[6]+x7*value[7] == sum:
res = max(res, x0+x1+x2+x3+x4+x5+x6+x7)
print(res)
基本思路:把sum和res先初始化,然后对于8个系数x进行嵌套循环,如果xi*value[i]==sum,那么就输出x0到x7的和的max值,直接输出res就ok
弊端:时间复杂度极高,在蓝桥的界面时间复杂度跑出来高达500ms!真是跑断腿。
三、最优算法(自认为)
后面与老师深♂入交流后,受到启发,写出了一种极其简单的算法。先放代码,在说思路。
num = 1000000
ans = 0
while num > 0:
a = num % 7
#算num的余数
num = num //7
#算num的整除,并且执行递归
ans += a
print (ans)
老规矩,先初始化num和ans值,ans用于存放最终结果,num为初值。
思路:
1.先不说100w,先从10举例,如果要求10这个数怎么分呢?首先10-1,9,9不能给7整除,在一直减法,直到7,可以被整除了,然后就得到3个7**0和1个7**1,那么最优分配法就是3*7**0+1*7**1。
2.再来100,如果是100该怎么分呢?首先100-1,不行,1000-2,98,好像可被7整除了,来试试?首先余数2,是2*7**0,98呢?7*7*2,哦~那就是7**2*2,那么,最优解就是2*7**0+2*7**2,其实就是,98分解,两个49,49又是7*7,再往下就没办法分解了,因此就是2*7**0+2*7**2这个结果,也就是98被7整除,得到14,余数为0,再被7整除,得到2,余数为0,因此就是7**2*2
3.那么由此之前的举例,再回到代码,我们只需要计算出,N数的余数和N的被整除数,即可得到我们的ans,从100可一看出,其实就是先得到N的余数,然后再被7整除,得到的数,然后再被整除,得到余数,然后再被整除,一直递归,直到被除数不能在被7整除,将以上得到结果都相加,就是最终得到的答案。
以上为一算法菜鸟刚学习开始的思路和理解,请各位大神指正,如果有更好的算法,也可以评论说明,很有兴趣学习学习。