zoukankan      html  css  js  c++  java
  • 背包问题

    背包问题

    题目:
    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]

    样例
    样例 1:
    输入: [3,4,8,5], backpack size=10
    输出: 9

    样例 2:
    输入: [2,3,5,7], backpack size=12
    输出: 12

    解题思路:从最后一个物品开始思考,如果前n - 1个物品可以拼出m那么前n个物品必然可以拼出m,此时不需要装入最后一个物品;如果前n - 1个物品不能拼出m,那么装入最后一个物品判断是否可以拼出m。同样,判断第n - 1个物品是否可以拼出m - A[n - 1]的重量分别考虑装入和不装入情况,以此类推

    public class Solution {
        /**
         * @param m: An integer m denotes the size of a backpack
         * @param A: Given n items with size A[i]
         * @return: The maximum size
         */
        public int backPack(int m, int[] A) {
            int len = A.length;
            if(len == 0)
                return 0;
            
            //数组定义: dp[i][j]表示装入前i个物品拼出j重量是否可行
            boolean dp[][] = new boolean[len + 1][m + 1];
    		//true可以拼出, false不可以
            dp[0][0] = true;
            
    		/**
    		状态方程:dp[i][j] = dp[i - 1][j] || dp[i - 1][j - A[i]]
    		**/
            for(int i = 1; i <= len; i++) {
                dp[i][0] = true;
                
                for(int j = 0; j <= m; j++) {
                    dp[i][j] = dp[i - 1][j];
                    if(j >= A[i - 1])
                        dp[i][j] = dp[i - 1][j] || dp[i - 1][j - A[i - 1]];
                }
            }
            
            int ans = 0;
            for(int i = m; i >= 0; i--) {
                if(dp[len][i]) {
                    ans = i;
                    break;
                }
            }
            
            return ans;
        }
    }
    
  • 相关阅读:
    如何心无旁鹜的编程
    [转]虚拟现实和现实增强技术带来的威胁
    Mac上好用软件集锦
    无论如何都要来报到
    Unity3D脚本语言UnityScript初探
    X3DOM新增剪裁平面节点ClipPlane支持
    用Perl编写Apache模块续二
    如何浪费自己青春
    macbook 我们需要买吗
    看了一本Unity3D的教程
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14036655.html
Copyright © 2011-2022 走看看