0-1背包问题

来源:互联网 发布:网络推广代理公司 编辑:程序博客网 时间:2024/04/30 18:34
/** * Created by fhqplzj on 16-8-20 at 上午11:56. */public class Knapsack {    private int knap(int[] w, int[] v, int W) {        assert w.length == v.length : "The length of w and v must be equal!";        int n = w.length;        int[][] dp = new int[n + 1][W + 1];        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= W; j++) {                if (j < w[i - 1]) {                    dp[i][j] = dp[i - 1][j];                } else {                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);                }            }        }        return dp[n][W];    }    private int knap2(int[] w, int[] v, int W) {        assert w.length == v.length : "The length of w and v must be equal!";        int n = w.length;        int[] dp = new int[W + 1];        for (int i = 0; i < n; i++) {            for (int j = W; j > 0; j--) {                if (j >= w[i]) {                    dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]);                }            }        }        return dp[W];    }    public static void main(String[] args) {        Knapsack knapsack = new Knapsack();        int[] w = {2, 2, 6, 5, 4};        int[] v = {6, 3, 5, 4, 6};        int W = 10;        int result = knapsack.knap2(w, v, W);        System.out.println("result = " + result);    }}

0 0