"""
@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))