背包问题
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]; } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树