背包问题

来源:互联网 发布:java报表程序 编辑:程序博客网 时间:2024/05/17 20:29

01背包问题

动态规划法

问题描述:有num件物品和一个容量为capacity的背包。第i件物品的体积是cubage[i],价值是value[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。

具体分析过程见动态规划0—1背包问题

Java实现:

import java.util.Scanner;public class KnapsackProblem {    public static void main(String[] args) {        test();    }    /**     * 从控制台输入数据,数据格式为:     * 第一行 背包容量v 物品数量n      * 第二行至第N+1行 物品体积c 物品价值w     *      * 输出:能够装入背包的物品的最大价值     */    public static void test() {        Scanner scanner = new Scanner(System.in);        while (scanner.hasNext()) {            int capacity = scanner.nextInt();            int num = scanner.nextInt();            int[] cubage = new int[num];            int[] value = new int[num];            for (int i = 0; i < num; i++) {                cubage[i] = scanner.nextInt();                value[i] = scanner.nextInt();            }            System.out.println(knapsackProblem(capacity, num, cubage, value));        }    }    /**     *      * @param capacity 背包容量     * @param num  物品数目     * @param cubage 每件物品的体积     * @param value  没见物品的价值     * @return       */    public static int knapsackProblem(int capacity, int num, int[] cubage, int[] value) {        int[][] totleValues = new int[num + 1][capacity + 1];        for (int i = 1; i < num + 1; i++) {            for (int j = 1; j < capacity + 1; j++) {                if (cubage[i - 1] > j) {                    totleValues[i][j] = totleValues[i-1][j];                }else{                    totleValues[i][j] = Math.max(totleValues[i - 1][j], totleValues[i - 1][j - cubage[i - 1]] + value[i - 1]);                }            }        }        return totleValues[num][capacity];    }}
0 0
原创粉丝点击