Python实现经典01背包问题:一堆宝石,一共有n个。 只有一个背包,背包的容量为C。n个宝石排成一排并编上号: 0...

题目:

一堆宝石,一共有n个。 只有一个背包,背包的容量为C。n个宝石排成一排并编上号: 0,1,2,…,n-1。第i个宝石体积和价值分别V[i]和W[i] 。背包容量为C,要装哪些宝石装的价值最高;

 

# -*- coding:utf-8 -*-
__author__ = 'yangxin_ryan'
"""
Solutions:
经典的01背包问题,选择添加与不添加;
那么有三种判断条件:
1.循环走完,最后一个应该是0;
2.当前背包的容量小于待加入的体积时,i+1,背包容量不变;
3.当前背包的容量大于待加入的体积是,max(self.run(i + 1, volume), self.run(i + 1, volume - self.weight_list[i]) + self.value_list[i])
也就是状态转移方程,最后返回结果即可;
"""


class BagQuestion(object):

    def __init__(self, n, weight_list, value_list):
        self.n = n
        self.weight_list = weight_list
        self.value_list = value_list

    def run(self, i, volume):
        if i == self.n:
            return 0
        elif volume < self.weight_list[i]:
            result = self.run(i + 1, volume)
        else:
            result = max(self.run(i + 1, volume), self.run(i + 1, volume - self.weight_list[i]) + self.value_list[i])
        return result


if __name__ == '__main__':
    bag_question = BagQue

你可能感兴趣的:(ACM,算法,Python)