算法问题——背包问题的理解

算法问题——背包问题的理解_第1张图片

 

/**
 * Copyright (C), 2018-2020
 * FileName: 背包问题01问题
 * Author:   xjl
 * Date:     2020/9/13 14:28
 * Description:
 */
package 动态规划问题集合;

import java.util.Arrays;

public class 背包问题01问题 {

    int[][] memo;

    /**
     * 01背包问题
     *
     * @param W
     * @param V
     * @param C
     * @return
     */
    public int Kapsack01(int[] W, int[] V, int C) {
        int n = W.length - 1;
        return bestValue(W, V, n, C);
    }



    /**
     * 表示的是的【0 ……index】的物品的填充的容积为C的背包的最大的价值
     *
     * @param w
     * @param v
     * @param index
     * @param c
     * @return
     */
    private int bestValue(int[] w, int[] v, int index, int c) {
        if (index < 0 || c <= 0) {
            return 0;
        }
        int res = bestValue(w, v, index - 1, c);
        if (c >= w[index]) {
            res=Math.max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
        }
        return res;
    }

    /**
     * 采用的是记忆化搜索的形式来实现
     *
     * @param W
     * @param V
     * @param C
     * @return
     */
    public int Kapsack02(int[] W, int[] V, int C) {
        int n = W.length - 1;
        memo = new int[n + 1][C + 1];
        Arrays.fill(memo, -1);
        return bestValue1(W, V, n, C);
    }

    /**
     * 表示的是的【0 ……index】的物品的填充的容积为C的背包的最大的价值
     * 采用个的是记忆化搜索的来实现的这样的一个效果
     *
     * @param w
     * @param v
     * @param index
     * @param c
     * @return
     */
    private int bestValue1(int[] w, int[] v, int index, int c) {
        if (index < 0 || c <= 0) {
            return 0;
        }
        if (memo[index][c] != -1) {
            return memo[index][c];
        }
        int res = bestValue1(w, v, index - 1, c);
        if (c >= w[index]) {
            res=Math.max(res, v[index] + bestValue1(w, v, index - 1, c - w[index]));
        }
        memo[index][c] = res;
        return res;
    }

}

算法问题——背包问题的理解_第2张图片

 算法问题——背包问题的理解_第3张图片

算法问题——背包问题的理解_第4张图片

 算法问题——背包问题的理解_第5张图片

算法问题——背包问题的理解_第6张图片 算法问题——背包问题的理解_第7张图片

你可能感兴趣的:(数据结构与算法,算法)