您的位置:首页 > 编程语言 > Java开发

背包问题

2016-06-26 20:07 543 查看

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];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息