• 01背包问题


     1 package com.company;
     2 
     3 import org.junit.Test;
     4 
     5 public class BeiBao01 {
     6 
     7 
     8     /*
     9     * 根据之前已经引出的状态转移方程,我们再来理解一遍,对于编号为 i 的物品:
    10 
    11 如果选择它,那么,当前背包的最大价值等于” i 号物品的价值“ 加上 ”减去 i 号物品占用的空间后剩余的背包空间所能存放的最大价值“,即dp[i][k] = value[i] + dp[i-1][k-weight[i]];
    12 
    13 如果不选择它,那么,当前背包的价值就等于前 i-1 个物品存放在背包中的最大价值,即 dp[i][k] = dp[i-1][k]
    14 
    15 dp[i][k] 的结果取两者的较大值,即:
    16 
    17 dp[i][k] = max(value[i] + dp[i-1][k-weight[i]], dp[i-1][k])
    18     *
    19     * */
    20 
    21     public int maxValue(int[] weight, int[] value, int W) {
    22         //这里假定传入的weight和values数组长度总是一致的
    23         int n = weight.length;
    24         if (n == 0) return 0;
    25 
    26         int[][] dp = new int[n + 1][W + 1];
    27         for (int i = 1; i <= n; i++) {
    28             for (int k = 1; k <= W; k++) {
    29                 // 存放 i 号物品(前提是放得下这件物品)
    30                 int valueWith_i = (k - weight[i - 1] >= 0) ? (value[i - 1] + dp[i - 1][k - weight[i - 1]]) : 0;
    31                 // 不存放 i 号物品
    32                 int valueWithout_i = dp[i - 1][k];
    33                 dp[i][k] = Math.max(valueWith_i, valueWithout_i);
    34                 System.out.println("i = " + i + " k = " + k);
    35                 System.out.println("dp[" + i + "][" + k + "]=" + dp[i][k]);
    36             }
    37         }
    38 
    39         return dp[n][W];
    40     }
    41 
    42     @Test
    43     public void main() {
    44         BeiBao01 obj = new BeiBao01();
    45         int[] w = {1, 4, 3};
    46         int[] v = {15, 30, 20};
    47         int W = 4;
    48         System.out.println(obj.maxValue(w, v, W));
    49     }
    50 }
  • 相关阅读:
    java学习笔记—ServletConfig、ServletContext接口(13)
    php中的XML DOM(11)
    php中的XML DOM(10)
    java学习笔记—Servlet技术(11)
    MM-移动类型
    MM-委外业务
    English-商务英文邮件例句100句
    ABAP-表中数据的横向累加
    MM-实际应用中的难题
    ABAP-加密解密
  • 原文地址:https://www.cnblogs.com/xhu218/p/16267379.html
Copyright © 2020-2023  润新知