京东2016实习笔试糖果因子最大组合
2016-04-08 21:30
344 查看
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int N = in.nextInt(); int capacity = in.nextInt(); int[] order = new int ; int[] factor = new int ; for (int i = 0; i < N; i++) { order[i] = in.nextInt(); factor[i] = in.nextInt(); } getMax(order, factor, N, capacity); } in.close(); } public static void getMax(int[] order, int[] factor, int size, int capacity) { /** * pre记录是否当前行数据数据使得dp更大 */ int[][] pre = new int[size + 1][capacity + 1]; int[][] dp = new int[size + 1][capacity + 1]; int maxFactor = 0; Stack<Integer> stack = new Stack<>(); for (int i = 1; i <= size; i++) { for (int j = 1; j <= capacity; j++) { if (order[i - 1] > j) { dp[i][j] = dp[i - 1][j]; pre[i][j] = -1; } else if (dp[i - 1][j] >= dp[i - 1][j - order[i - 1]] + factor[i - 1]) { dp[i][j] = dp[i - 1][j]; pre[i][j] = -1; } else { dp[i][j] = dp[i - 1][j - order[i - 1]] + factor[i - 1]; pre[i][j] = 1; if (factor[i - 1] > maxFactor) { maxFactor = factor[i - 1]; } } } } int capa = dp[size][capacity]; /** * 无满足组合时输出信息 */ if (dp[size][capacity] == 0) { System.out.println("0"); System.out.println("No"); } else { System.out.println(maxFactor); int i = size; int j = capacity; /** * 记录由那些行数据组成 */ while (capa > 0 && i >= 1 && j >= 1) { if (pre[i][j] == 1) { stack.push(i); j = j - order[i - 1]; capa -= factor[i - 1]; i--; } else { i--; } } } while (!stack.isEmpty()) { System.out.print(stack.pop() + " "); } System.out.println(); return; } }
相关文章推荐
- 【C++】《More Effective C++》读书笔记(转载+修订)
- java学习-3.操作符
- 提取页面宽度的问题
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
- 京东2016笔实习生在线笔试题
- hdu 1078(记忆化搜索)
- golang 使用 iota
- mysql 慢查询日志
- Ajax-入门
- 112. Path Sum
- 数据存储的几种方式
- Eclipse自定义快捷键代替方向键
- 如何学习java ssh三大框架
- 在O(n)的时间复杂度内找出数组中出现次数超过了一半的数
- HDU4572-Bottles Arrangement-找规律
- setObject()用法
- 【bzoj1031】[JSOI2007]字符加密Cipher
- jquery.validate全攻略
- ubuntu 普通用户改为管理员模式方法
- 树莓派