编程之美--游戏之乐--1.4买书问题(改进解法)

原版解法以及改进解法均给出

改进解法思路展示:

假设输入为[7,6,5,4,3]
通过某个过程达到了[3,3,3,3,3]这种状态
那么这时候的结果res+=5*0.25*3即可
不需要继续执行下去
同理
如果出现了[0,3,3,3,3]这种状态
那么这时候的结果res+=4*0.2*3即可
不需要继续执行下去
因此程序存在优化空间
在此我只给出第一种其中下的优化解法
之后的优化同理可以写出来
  • 原版解法
#coding=utf-8
#author='HL'



class Solution():
    def solve(self,nums):
        nums = sorted(nums)
        res = self.in_Put(nums)
        return 8*(sum(nums)-res)



    def in_Put(self,nums):
        #print nums#
        '''
        用作测试程序调用次数
        输入为[7,6,5,4,3]时
        该程序调用了2万次左右
        '''

        res = 0
        if self.is_Equal(nums):
            return 5*0.25*nums[0]

        if nums[0]>0:
            res = max(5*0.25+self.in_Put([ nums[i]-1 for i  in range(len(nums))]),res)
        if nums[1]>0:
            res = max(4*0.2+self.in_Put(sorted(nums[:1]+[nums[i]-1 for i in range(1,len(nums))])),res)
        if nums[2]>0:
            res = max(3*0.1+self.in_Put(sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])), res)
        if nums[3] > 0:
            res = max(2*0.05+self.in_Put(sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])), res)
        return res


    def is_Equal(self,nums):
        for i in range(len(nums)-1):
            if nums[i]!=nums[i+1]:
                return False
        return True


zz = Solution()
print zz.solve([2,2,2,1,1])

  • 改进解法
#coding=utf-8
#author='HL'



class Solution():
    def solve(self,nums):
        nums = sorted(nums)
        res = self.in_Put(nums)
        return 8*(sum(nums)-res)


    '''
    假设输入为[7,6,5,4,3]
    通过某个过程达到了[3,3,3,3,3]这种状态
    那么这时候的结果res+=5*0.25*3即可
    不需要继续执行下去
    同理
    如果出现了[0,3,3,3,3]这种状态
    那么这时候的结果res+=4*0.2*3即可
    不需要继续执行下去
    因此程序存在优化空间
    在此我只给出第一种其中下的优化解法
    之后的优化同理可以写出来
    '''
    def in_Put(self,nums):
        #print nums#
        '''
        用作测试程序调用次数
        输入为[7,6,5,4,3]时
        该程序调用了3千次左右
        '''



        res = 0
        if self.is_Equal(nums):
            return 5*0.25*nums[0]

        if nums[0]>0:
            res = max(5*0.25+self.in_Put([ nums[i]-1 for i  in range(len(nums))]),res)
        if nums[1]>0:
            newnums = sorted(nums[:1] + [nums[i] - 1 for i in range(1, len(nums))])
            if self.is_Equal(newnums):
                res = max(4 * 0.2 + 5 * 0.25 * newnums[0], res)
                return res
            else:
                res = max(4 * 0.2 + self.in_Put(newnums), res)
        if nums[2]>0:
            newnums = sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])
            if self.is_Equal(newnums):
                res = max(3 * 0.1 + 5 * 0.25 * newnums[0], res)
                return res
            else:
                res = max(3 * 0.1 + self.in_Put(newnums), res)
        if nums[3] > 0:
            newnums = sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])
            if self.is_Equal(newnums):
                res = max(2*0.05 + 5 * 0.25 * newnums[0], res)
                return res
            else:
                res = max(2 * 0.05 + self.in_Put(newnums), res)
        return res


    def is_Equal(self,nums):
        for i in range(len(nums)-1):
            if nums[i]!=nums[i+1]:
                return False
        return True

zz = Solution()
print zz.solve([7,6,5,4,3])

通过改进算法,其实仍有更为优化的算法这里就不一一赘述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值