zoukankan      html  css  js  c++  java
  • 0/1 knapsack problem

    Problem statement

    Given n items with size Ai and value Vi, and a backpack with size m. What's the maximum value can you put into the backpack?

    Solution

    0/1 knapsack problem is a classical dynamic programming model. There is a knapsack with the capacity of m, you should find the maximum volume can be filled in. 

    Still, we need:

    • DP memory and the representation
    • The initialization of DP memory
    • DP formula
    • Return value.

    DP memory and the representation

    Suppose, size is the number of elements in A.

    A two dimension array: dp[size + 1][m + 1]

    • dp[i][j]: means the maximum volume formed by first i elements whose volume is at most j.

    The key word is the first and at most. 

    • The first means there are i + 1 elements.
    • At most means the total volume can not exceed j.

    Initialization

    For a two dimension DP memory, normally, we should initialize the first row and column, and start from i = 1 and j = 1. The initialization comes from general knowledge.

    • dp[0][i]: first 0 elements can form at most i volume. Obviously, the initialization is 0 since we can get nothing if there is no elements.
    • dp[i][0]: first i elements can form at most 0 volume. Obviously, the initialization is 0 since we can get 0 volume by any elements.

    DP formula

    For current element A[i], we need to know what is the maximum volume can get if we add it into the backpack.

    • dp[i][j] = dp[i - 1][j] if A[i - 1] is greater than j
    • dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - A[i - 1]]) if j >= A[i - 1], we find the maximum value.

    Return value.

    Just return dp[size][m]

    Time complexity is O(size * m)

    class Solution {
    public:
        /**
         * @param m: An integer m denotes the size of a backpack
         * @param A & V: Given n items with size A[i] and value V[i]
         * @return: The maximum value
         */
        int backPackII(int m, vector<int> A, vector<int> V) {
            // write your code here
            // write your code here
            int size = A.size();
            //vector<vector<int>> dp(size + 1, vector<int>(m + 1, 0));
            int dp[size + 1][m + 1] = {};
            for(int i = 1; i <= size; i++){
                for(int j = 1; j <= m; j++){
                    dp[i][j] = dp[i - 1][j];
                    if(j >= A[i - 1]){
                        dp[i][j] = max(dp[i][j], V[i - 1] + dp[i - 1][j - A[i - 1]]);
                    }
                }
            }
            return dp[size][m];
        }
    };
  • 相关阅读:
    30 algorithm questions study
    Binary Tree: Write a function to return count of nodes in binary tree which has only one child.
    分布式排序
    android开发中,工程前面有感叹号的解决办法
    android导入工程出现红色感叹号
    INSTALL_FAILED_MISSING_SHARED_LIBRARY错误解决方法
    安卓手机铃声怎么设置
    如何开启Mysql远程访问
    android 链接mysql数据库
    android 连接mysql数据库问题
  • 原文地址:https://www.cnblogs.com/wdw828/p/6919446.html
Copyright © 2011-2022 走看看