回溯算法背包问题(Java版)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯算法背包问题(Java版)相关的知识,希望对你有一定的参考价值。

背包问题 请参考 算法竞赛-动态规划

题目描述

给定n件物品和一个容量为C的背包,物品i的重量是Wi,价值为Vi。试求如何选择装入背包的物品,使得物品的总价值最大。

输入输出

输入:

第一行输入一个整数C(0<C<10^9),表示背包容量。
第二行输入n(n<=15),表示物品个数
第三行输入n个整数,wi表示第i个物品的重量(0<wi<10^9)
第四行输入n个整数,vi表示第i个物品的价值(0<vi<10^9)

输出:

输出一行整数,表示背包的最大价值。

样例

10
5
2 3 7 8 2
10 5 2 3 1

输出:

16

代码展示

对于每一个物品我们都有选择与放弃两种,因此递归二叉树应用而生。

import java.io.*;

public class Main {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static int max = 0, n;
    static int[] w, v;
    public static void main(String[] args) {
        int c = nextInt();
        n = nextInt();
        w = new int[n];
        v = new int[n];
        for (int i = 0; i < n; i++) {
            w[i] = nextInt();
        }
        for (int i = 0; i < n; i++) {
            v[i] = nextInt();
        }
        dfs(0, c, 0);
        System.out.println(max);
    }
    public static void dfs(int i, int W, int V) {
    	// 剪枝操作
        if (W < 0) {
            return;
        }
        // 更新max
        max = Math.max(max, V);
        
         // 递归结束条件
        if (i == n) {
            return;
        }
        dfs(i+1, W, V);  // 放弃
        dfs(i+1, W-w[i], V+v[i]);  // 选择
    }

    static int nextInt() {
        try {
            in.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int)in.nval;
    }
}

感谢

小猪梦想变大牛

加油!

以上是关于回溯算法背包问题(Java版)的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法 ------回溯算法的几个例子

回溯算法解八皇后问题(java版)

0-1背包问题如下,画用回溯法求解时的搜索情况,急用啊

用回溯法解定和子集问题、0/1背包问题和n皇后问题的算法比较

[动态规划与回溯算法] 01背包

背包算法java版