【完全背包+贪心】leetcode每日一题—1449.数位成本和为目标值的最大数字

461 篇文章 1 订阅

题目:
给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数:

给当前结果添加一个数位(i + 1)的成本为 cost[i] (cost 数组下标从 0 开始)。
总成本必须恰好等于 target 。
添加的数位中没有数字 0 。
由于答案可能会很大,请你以字符串形式返回。

如果按照上述要求无法得到任何整数,请你返回 “0” 。
在这里插入图片描述
在这里插入图片描述
思路:
完全背包+贪心

解答:

class Solution:
    def largestNumber(self, cost: List[int], target: int) -> str:
        dp = [float("-inf")] * (target + 1)
        dp[0] = 0

        dic=collections.Counter(cost)
        #print(dic)
        #完全背包,dp[i][j]:由前i个数(可重复选取)凑成j 最多需要多少个数
        for c in dic.keys():
            for j in range(c, target + 1):
                dp[j] = max(dp[j], dp[j - c] + 1)
        #print(dp)

        if dp[target] < 0:
            return "0"
        
        #返回指定位数的最大数值
        ans = list()
        j = target
        for i in range(8, -1, -1):
            #若j=0,则已得到最终的遍历结果,故无需再遍历
            if j==0:
                break
            c = cost[i]
            while j >= c and dp[j] == dp[j - c] + 1:
                ans.append(str(i + 1))
                j -= c

        return "".join(ans)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值