背包问题
Posted xiueer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包问题相关的知识,希望对你有一定的参考价值。
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];
以上是关于背包问题的主要内容,如果未能解决你的问题,请参考以下文章