zoukankan      html  css  js  c++  java
  • Lintcode: Backpack

    Given n items with size A[i], an integer m denotes the size of a backpack. How full you can fill this backpack? 
    
    Note
    You can not divide any item into small pieces.
    
    Example
    If we have 4 items with size [2, 3, 5, 7], the backpack size is 11, we can select 2, 3 and 5, so that the max size we can fill this backpack is 10. If the backpack size is 12. we can select [2, 3, 7] so that we can fulfill the backpack.
    
    You function should return the max size we can fill in the given backpack.

    DP.

    boolean d[i][j]:  For the first i items, can we fill a backpack of size j? true or false.

    d[i][j] = d[i-1][j] || (j>=A[i-1] && d[i-1][j-A[i-1]]).

    d[0][0] = true;

    We can use 1D array to perform the DP.

    d[j] = d[j] || d[j-A[i-1]].

    NOTE: for 1D array, the j must be decreased from m to 0 rather increasing from 0 to m!

    2D code:

     1 public class Solution {
     2     /**
     3      * @param m: An integer m denotes the size of a backpack
     4      * @param A: Given n items with size A[i]
     5      * @return: The maximum size
     6      */
     7     public int backPack(int m, int[] A) {
     8         // write your code here
     9         boolean[][] res = new boolean[A.length+1][m+1];
    10         res[0][0] = true;
    11         for (int i=1; i<=A.length; i++) {
    12             for (int j=0; j<=m; j++) {
    13                 res[i][j] = res[i-1][j] || (j-A[i-1]>=0 && res[i-1][j-A[i-1]]);
    14             }
    15         }
    16         for (int j=m; j>=0; j--) {
    17             if (res[A.length][j]) return j;
    18         }
    19         return 0;
    20     }
    21 }

    1D code:

     1 public class Solution {
     2     /**
     3      * @param m: An integer m denotes the size of a backpack
     4      * @param A: Given n items with size A[i]
     5      * @return: The maximum size
     6      */
     7     public int backPack(int m, int[] A) {
     8         if (A.length==0) return 0;
     9         
    10         int len = A.length;
    11         boolean[] size = new boolean[m+1];
    12         Arrays.fill(size,false);
    13         size[0] = true;
    14         for (int i=1;i<=len;i++)
    15             for (int j=m;j>=0;j--){
    16                 if (j-A[i-1]>=0 && size[j-A[i-1]])
    17                     size[j] = size[j-A[i-1]];
    18             }
    19 
    20         for (int i=m; i>=0;i--)
    21             if (size[i]) return i;
    22 
    23         return 0;
    24     }
    25 }
  • 相关阅读:
    Dart语言学习笔记(5)
    使用 Dart 调用 REST API
    JSON数据的解析和生成(Dart)
    趣味编程:静夜思(Dart版)
    正则表达式(Dart)
    Dart语言学习笔记(4)
    Dart语言学习笔记(3)
    C++11特性之右值引用
    各大编程字体比较
    优先队列的应用 C++实现
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4269149.html
Copyright © 2011-2022 走看看