题目:
给你一个整数数组 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)