zoukankan      html  css  js  c++  java
  • 数据结构:0/1背包问题

    数据结构:0/1背包问题

    0/1背包问题

    题目描述

      有N件物品和一个容量为V 的背包。放入第i件物品耗费的费用是Ci1,得到 的价值是Wi 。求解将哪些物品装入背包可使价值总和最大?

    基本思路

      这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放

      用子问题定义状态:即F [i, v]表示前i件物品恰放入一个容量为v的背包可 以获得的最大价值

      则其状态转移方程便是:

        

       这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。

      “将前i件物品放入一个容量为v的背包中”,这个子问题,若只考虑第i件物品放不放,那么就可以转变为一个只与前i-1件物品相关的问题

        ——如果不放第i件物品,那么问题就转化 为“前i − 1件物品放入容量为v的背包中”,价值为F [i − 1, v] 

        ——如果放第i件物品,那么问题就转换 为前i − 1件物品放入剩下的容量为v − Ci的背包中,此时能获得的最大价值就是F [i − 1, v − Ci]再加上通过放入第i件物品获得的价 值Wi 。 

     Java题解-DFS

    class Solution{
        //物品重量
        private int[] weights={1,2,3,4};
        //物品价值
        private int[] values ={6,5,4,3};
        //背包重量
        private int MaxWeight = 9;
        //物品数量
        private int NumOfItems = 4;
        //答案
        int ans;
    
        public  int knapsack01DFS(int V,int[] weights, int[] values)
        {
            ans = 0;
            DFS(0,0,0);
            return ans;
        }
    
        public  void DFS(int s,int cur_v,int cur_w)
        {
            ans = Math.max(cur_v,ans);
            if(s==NumOfItems)
                return;
            for(int i=s;i<weights.length;i++)
            {
                if(cur_w+weights[i]<=MaxWeight)
                    DFS(i+1,cur_v+values[i],cur_w+weights[i]);
            }
    
        }
    }

     Java题解-DP

    public int knapsack(int W, int N, int[] weights, int[] values) {
        int[][] dp = new int[N + 1][W + 1];
        for (int i = 1; i <= N; i++) {
            int w = weights[i - 1], v = values[i - 1];
            for (int j = 1; j <= W; j++) {
                if (j >= w) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w] + v);
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        return dp[N][W];
    }
  • 相关阅读:
    jascript基础教程学习总结(2)
    ajax原理图解
    ajax原理
    javascript基础教程学习总结(1)
    HTML学习(1)
    vi编辑器
    effective C++ 4 Make sure objects are initialized before they are used
    effective C++ 3 use const whenever possible
    STL: string:erase
    STL: 从reverse到iterator
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9340251.html
Copyright © 2011-2022 走看看