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

    1.问题

    np完全问题 ,给定一组物品,每个都有自己的重量和价格,在限定的总重量内,如何选择使物品的总价格最高

    2 基础背包

      N个物品和容量为V的背包,每个物品的重量为w[i] 价值为v[i],求装那些物品可以不超过背包容量且价值最大

     递推公式     f[i][v] = max( f[i-1][v], f[i-1][v-w[i]] + v[i])

      考虑第i物品的策略,如果把第i件物品放入背包,则问题转化为前i-1物品放入剩下容量v-w背包中,此时获得的最大价值是发发f[i-1][v-w[i]]加上第i件物品价值,如果不放如,就转化为前i-1物品放入容量v背包中价值为f[i-1][v]

        public int backPack(int m, int[] A) {
            // write your code here
            boolean[][] f = new boolean[A.length + 1][m + 1];
            f[0][0] = true;
            for (int i = 1; i <= A.length; i++){
                for (int j = 0; j <= m; j++){
                    f[i][j] = f[i - 1][j];
                    if (j >= A[i - 1] && f[i][j - A[i - 1]){
                        f[i][j] = true;
                    }
                }
            }
            for (int i = m; i >= 0; i--){
                if (f[A.length][i]){
                    return i;
                }
            }
            return 0;
        }
    View Code
        public int backPackII(int m, int[] A, int V[]) {
            // write your code here
            if (m == 0 || A.length == 0 || V.length == 0) return 0;
            int[] dp = new int[m + 1];
            for (int i = 0; i < A.length; i++){
                for (int j = m; j >= A[i]; j--){
                    dp[j] = Math.max(dp[j], dp[j - A[i]] + V[i]);
                }
            }
            return dp[m];
        }
    View Code
  • 相关阅读:
    测试产品
    三年回顾
    测试服务输出业务价值
    慎用重载_2
    慎用重载_1
    ByteBuffer和String的互相转换
    线程较为深的度剖析1
    线程同步的故事描述
    Java线程同步
    TCP关闭过程
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7080412.html
Copyright © 2011-2022 走看看