0-1背包问题 Python

"""
@author:  wangquaxiu
@time:  2020/3/2 21:21
"""


"""
最大价值草药
输入第一行为两个整数T M,以空格隔开,T代表背包空间,M代表物品种类
下面M行每行两个整数v w,v代表物品所占空间,w代表物品的价值

输入样例:
70 3
71 100
69 1
1 2

样例输出:
3

"""
t,m = map(int,input().split())

# 存放物品信息
hurb = [None for i in range(m+1)]

# 声明一个二维矩阵,dp[i][j]代表,前i件物品在,容量为j的背包中所能盛放的最大价值
dp = [[0 for j in range(t+1)] for i in range(m+1)]


for i in range(1,m+1):
    hurb[i] = list(map(int,input().split()))


# 外层循环对物品进行迭代
for i in range(1,m+1):
    # j = t
    # while(j >= hurb[i][0]):
    #     dp[i][j] = max(dp[i-1][j],dp[i-1][j-hurb[i][0]] + hurb[i][1])
    #     j-=1
    # j = hurb[i][0]-1
    # while(j>=0):
    #     dp[i][j] = dp[i-1][j]
    #     j-=1
    # 内层循环对容量进行迭代
    for j in range(0,t+1):
        
        if(j < hurb[i][0]):
            # hurb[i][0]代表第i件物品的体积
            # 如果当前物品的体积大于背包容量,则物品不放入背包,
            # 此时背包能盛放的最大价值与相同容量下前i-1件物品相同。
            dp[i][j] = dp[i-1][j]
        else:
            # 如果当前物品的体积小于背包容量,则物品可能放入背包,按两种情况讨论:
            # 容量为j,前i-1件物品的最大价值为dp[i-1][j]   
            # 当前物品的价值+【容量为(j - 当前物品体积)的背包,前i-1件物品的最大价值】为dp[i - 1][j - hurb[i][0]] + hurb[i][1]
            # 取两者最大值为dp[i][j]
            
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - hurb[i][0]] + hurb[i][1])
print(dp[m][t])

 

 

 

补充题目

"""
@author:  wangquaxiu
@time:  2020/3/30 18:07
"""


"""

众所周知,牛能和牛可乐经常收到小粉丝们送来的礼物,
每个礼物有特定的价值,他俩想要尽可能按照自己所得价值来
平均分配所有礼物。

那么问题来了,在最优的情况下,他俩手中得到的礼物价值和的
最小差值是多少呢?
p.s 礼物都很珍贵,所以不可以拆开算哦

示例1
输入
[1,2,3,4]
输出
0



本题的特殊性:
初一看,没有物品的体积,
但可以看做物品的体积等于价值

"""

def maxPresent(presentVec ):
    s = sum(presentVec)

    n = len(presentVec)
    v = int(s/2)
    # print("v: %d" % (v))
    dp = [[0 for _ in range(v+1)] for _ in range(n+1)]
    for i in range(0,n):
        for j in range(1,v+1):
            if(j >= presentVec[i]):
                dp[i+1][j] = max(dp[i][j],dp[i][j-presentVec[i]]+presentVec[i])
            else:
                dp[i+1][j] = dp[i][j]
    # print(dp[n][v])
    return (s-2*dp[n][v])
data = list(map(int,input().split(',')))
print(maxPresent(data))

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值