DP完全背包

Written with StackEdit.

特征

每件物品不限数量

思路

转化为0/1背包(?)
每个物体尽可能多放(Why?)
递推式为:
F ( i , j ) = M a x { F ( i 1 , w k w [ i ] ) + k v [ i ] } , k w [ i ] < w F(i,j)=Max\{F(i-1,w-kw[i])+kv[i]\} ,\forall kw[i]<w
其他思路和01背包相同.
检查每一个K不会造成越界的k.
0/1背包就是完全背包的退化问题.

代码

'''
@Description: 
@Date: 2019-10-31 22:20:43
@Author: I-Hsien
@LastEditors: I-Hsien
@LastEditTime: 2019-10-31 22:42:45
'''
def build(set,weight):
    if set==[] or weight==0:
        return 0
    kr=[]
    k=0
    while(k*set[-1][0]<=weight):
        kr.append(build(set[:-1],weight-k*set[-1][0])+k*set[-1][1])
        k+=1
    return max(kr)


if __name__=="__main__":
    temp=input().split()
    maxweight=int(temp[0])
    quantity=int(temp[1])
    array=[]#[(weight,value)]
    for _ in range(quantity):
        tor=input().split()
        array.append((int(tor[0]),int(tor[1])))
    print(int(build(array,maxweight)))

果然又TLE了…
这递归不是等着爆栈吗…

发布了80 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/POTASSIUM711/article/details/102847505
今日推荐