n,m=map(int,input().split())
W=[]
V=[]
#转化为01背包问题,同时减少重复的数据,降低时间复杂度
for i in range(n):
a,b,c=map(int,input().split())
q=min(m//a,c)
p=1
while q>p:
W.append(a*p)
V.append(b*p)
q-=p
p*=2
W.append(a*q)
V.append(b*q)
#同01背包解法
n=len(W)
dp=[0]*(m+1)
for i in range(n):
for j in range(m,W[i]-1,-1):
dp[j]=max(dp[j],dp[j-W[i]]+V[i])
print(dp[m])
0.0分
0 人评分
C语言训练-邮票组合问题* (C语言代码)......浏览:689 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:668 |
C语言程序设计教程(第三版)课后习题6.3 (Java代码)浏览:695 |
【出圈】 (C语言代码)浏览:590 |
兰顿蚂蚁 (C++代码)浏览:1160 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:591 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:710 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:585 |
关于float,double变量的几点说明浏览:1926 |
C二级辅导-等差数列 (C语言代码)浏览:891 |