• PHP 背包问题动态规划


    <?php
    
    class Item{
    
        private $weight = 0;
        private $price = 0;
        private $name = "";
    
        /**
         * Item constructor.
         * @param string $name
         * @param int $price
         * @param int $weight
         */
        public function __construct(string $name ,int $weight, int $price)
        {
            $this->name = $name;
            $this->weight = $weight;
            $this->price = $price;
        }
    
    
        /**
         * @return string
         */
        public function getName(): string
        {
            return $this->name;
        }
    
        /**
         * @param string $name
         */
        public function setName(string $name)
        {
            $this->name = $name;
        }
    
    
        /**
         * @return int
         */
        public function getWeight(): int
        {
            return $this->weight;
        }
    
        /**
         * @param int $weight
         */
        public function setWeight(int $weight)
        {
            $this->weight = $weight;
        }
    
        /**
         * @return int
         */
        public function getPrice(): int
        {
            return $this->price;
        }
    
        /**
         * @param int $price
         */
        public function setPrice(int $price)
        {
            $this->price = $price;
        }
    
    }
    
    class Bags{
    
        const DEFAULT_VALUE = 0;
        private $capacity = 0;
        private $items = [];
        private $tables = [];
    
    
    
        public function __construct( $capacity )
        {
            $this->capacity = $capacity;
        }
    
        public function addItem( Item $item ){
            return array_push($this->items, $item);
        }
    
        //获取背包最大价值
        public function getMaxValue(){
    
            //建立二维表
            $this->initTable();
            $capacitys = $this->getCapacity();
            $itemCount = count($this->items);
            $curItem = null;
            $curVal = 0;
            $curWeight = 0;
            for ( $i = 1; $i <= $itemCount; $i++ ){
                for( $curCapacity=1; $curCapacity <= $capacitys; $curCapacity++ ){
                    $curItem = $this->items[$i-1];
                    $curVal = $curItem->getPrice();
                    $curWeight = $curItem->getWeight();
    
                    $this->tables[$i][$curCapacity] = $this->tables[$i-1][$curCapacity] ?? static::DEFAULT_VALUE;
                    $spareVal = $this->tables[$i-1][$curCapacity-$curWeight]['val'] ?? static::DEFAULT_VALUE;
    
                    $lastVal = $this->tables[$i-1][$curCapacity]['val'] ?? static::DEFAULT_VALUE;
                    $maxVal = $curVal + $spareVal;
                    if( $curCapacity >= $curWeight
                        &&  ($maxVal > $lastVal) ){
                        $content = "name:".$curItem->getName()." ,price: ".$curItem->getPrice() ." weight:".$curItem->getWeight();
                        $this->tables[$i][$curCapacity] = [
                            'val'=>$maxVal ,
                            'content'=> array_merge( $this->tables[$i-1][$capacitys-$curWeight]['content']??[], [$content])
                        ];
                    }
                }
            }
            return $this->tables[$itemCount][$capacitys];
        }
    
        public function initTable(){
    
            $capacitys = $this->getCapacity();
            $itemCount = count($this->items);
            for ( $i = 1; $i <= $itemCount; $i++ ){
                for( $j=1; $j<= $capacitys; $j++ ){
                    $this->tables[$i][$j] = [
                        'val'=> static::DEFAULT_VALUE,
                        'content'=>''
                    ];
                }
            }
            return $this->tables;
        }
    
        //根据背包计算
        public function getCapacity(){
            return $this->capacity;
        }
    
        public function getTables(){
            return $this->tables;
        }
    }
    
    
    $bag = new Bags( 4 );
    
    
    $item1 = new Item('吉他', 1, 1500);
    $item2 = new Item('音响', 4, 3000);
    $item3 = new Item('笔记本电脑', 3, 2000);
    $item4 = new Item('钻石',1 , 6000);
    $item5 = new Item('钻石2',1 , 20000);
    
    
    
    $bag->addItem($item5);
    $bag->addItem($item4);
    $bag->addItem($item1);
    $bag->addItem($item2);
    $bag->addItem($item3);
    
    
    $maxVal = $bag->getMaxValue();
    print_r($maxVal);
  • 相关阅读:
    45
    布里斯班初体验
    走出你的舒适区
    Homebrew- MAC上的包管理利器
    Java经典类库-Guava中的函数式编程讲解
    使用WebDriver遇到的那些坑
    CheckStyle, 强制你遵循编码规范
    利用php的register_shutdown_function来记录php的输出日志
    PHP-redis中文文档
    php中set_time_limit()函数运用
  • 原文地址:https://www.cnblogs.com/glory-jzx/p/13634973.html
Copyright © 2020-2023  润新知