动态规划-背包问题

背包容量为9,在背包可承受范围内,携带价值更高的物品。并列出背那些物品

物品重量价值
25
44
56
32
class solution():

    def __init__(self, w, v, num):
        self.res_table = [[0 for i in range(num + 1)] for i in range(len(w) + 1)]
        self.w = w
        self.v = v
        self.num = num
        self.res = []

    def solve(self):
        for i in range(1, len(self.res_table)):
            for j in range(len(self.res_table[0])):
                if j >= self.w[i - 1]:
                    self.res_table[i][j] = max(self.res_table[i - 1][j],
                                               self.res_table[i - 1][j - self.w[i - 1]] + self.v[i - 1])
                else:
                    self.res_table[i][j] = self.res_table[i - 1][j]
        return self.res_table[len(self.w)][self.num]

    def res_choice(self):
        """
        回溯算法
        :return:返回背包内容,用数组体现,0代表没有装,1代表装了
        """
        res = self.res_table[len(self.w)][self.num]
        for i in range(len(self.res_table)):
            for j in range(len(self.res_table[0])):
                if self.res_table[i][j]==res:
                    self.fun(i,j,res,[0 for i in range(len(w))])
        return self.res

    def fun(self,i,j,num,res):
        if self.v[i-1] == num:# 结束条件
            res[i-1] = 1
            if res not in self.res:
                self.res.append(res)
            return
        if num == self.res_table[i - 1][j]: # 第一种情况
            temp_res = res.copy()
            self.fun(i-1,j,num,temp_res)
        if num == self.res_table[i - 1][j - self.w[i - 1]] + self.v[i - 1]:# 第二种情况
            temp_res = res.copy()
            temp_res[i-1] = 1
            self.fun(i-1,j - self.w[i - 1],num-self.v[i - 1],temp_res)


if __name__ == '__main__':
    w = [2, 4, 5, 3]
    v = [5, 4, 6, 2]
    num = 9
    my_solution = solution(w, v, num)
    print(my_solution.solve())
    print(my_solution.res_choice())
<<<
11
[[1, 0, 1, 0], [1, 1, 0, 1]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值