这是一道华为机试题,出的真的挺不错。
注意:本代码提供了一个错误解法,我一开始以为是对的!!!实际是有问题的, 试了很多例子试出来了一个。这个题的正解就是用动态规划!!!
大概看下题:
有M个正整数[1,4,2,1,3,2,...],提供两个相同的仓库(容量相同)来存放这些整数; 问提供最小的仓库是多少。
动态规划/背包问题。
即:一半的背包最多能装多少。然后剩下的都装到另一个背包。
直接看代码:
# 有M个正整数[1,4,2,1,3,2,...],提供两个相同的仓库来存放这些整数;
# 问提供最少的仓库是多少。
# 动态规划/背包问题。
# 即:一半的背包最多能装多少。然后剩下的都装到另一个背包。
def error_example(nums):
nums = sorted(nums, reverse=True)
n1 = 0
n2 = 0
for num in nums:
if n1 >= n2:
n2 += num
else:
n1 += num
return max(n1, n2)
def bag(nums):
n = len(nums)
m = sum(nums) // 2
dp = [[0 for _ in range(m+1)] for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, m+1):
if j-nums[i-1] < 0: # 装不下
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i-1]]+nums[i-1])
return sum(nums)-dp[n][m]
nums = [14,12,13,3,12,13,23,23]
error_res = error_example(nums)
print(error_res)
res = bag(nums)
print(res)
再次申明,注意:本代码提供了一个错误解法。
这个错误解法能过很多用例,但是不对,感觉到不对又说不太出来。。。
好了,乖乖用动态规划就好。
就这样吧。!
加油!。