跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题不是leetcode题背包问题的很不错的变种

这是一道华为机试题,出的真的挺不错。

注意:本代码提供了一个错误解法,我一开始以为是对的!!!实际是有问题的, 试了很多例子试出来了一个。这个题的正解就是用动态规划!!!

大概看下题:

有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)

再次申明,注意:本代码提供了一个错误解法。
这个错误解法能过很多用例,但是不对,感觉到不对又说不太出来。。。
好了,乖乖用动态规划就好。
就这样吧。!
加油!。

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107571042
今日推荐