回溯算法背包问题(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版)的主要内容,如果未能解决你的问题,请参考以下文章