POJ1014

来源:互联网 发布:雷盾网络验证山寨 编辑:程序博客网 时间:2024/06/08 17:31

 题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1014

 思路:类似背包的方法,不过可以先优化下,优化的方法:http://162.105.81.202/course/problemSolving/dividingProve.doc

             也可以去http://www.blogjava.net/zellux/archive/2007/07/30/133416.html?P_AVPASS=PHDGBITAVPASSP看看C的解决方案

             以及纯DP+剪枝的实现方法。

 

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. public class Main {
  5.     public static void main(String[] args) throws IOException {
  6.         BufferedReader read = new BufferedReader(new InputStreamReader(
  7.                 System.in));
  8.         String[] s;
  9.         int[] marbles;
  10.         int sum;
  11.         int part;
  12.         int times = 0;
  13.         while (true) {
  14.             marbles = new int[6];
  15.             sum = 0;
  16.             s = read.readLine().split(" ");
  17.             for (int i = 0; i < 6; i++) {
  18.                 marbles[i] = Integer.parseInt(s[i]);
  19.             }
  20.             if (marbles[5] > 5) {
  21.                 marbles[5] = 4 + marbles[5] % 2;
  22.             }
  23.             if (marbles[4] > 6) {
  24.                 marbles[4] = 6 - marbles[4] % 2;
  25.             }
  26.             if (marbles[3] > 5) {
  27.                 marbles[3] = 4 + marbles[3] % 2;
  28.             }
  29.             if (marbles[2] > 5) {
  30.                 marbles[2] = 4 + marbles[2] % 2;
  31.             }
  32.             if (marbles[1] > 4) {
  33.                 marbles[1] = 4 - marbles[1] % 2;
  34.             }
  35.             for (int i = 0; i < 6; i++) {
  36.                 sum += marbles[i] * (i + 1);
  37.             }
  38.             if (sum == 0) {
  39.                 break;
  40.             }
  41.             times++;
  42.             System.out.printf("Collection #%d:/n", times);
  43.             if (sum % 2 != 0) {
  44.                 System.out.println("Can't be divided.");
  45.                 System.out.println();
  46.                 continue;
  47.             }
  48.             part = sum / 2;
  49.             if (search(part, marbles)) {
  50.                 System.out.println("Can be divided.");
  51.             } else {
  52.                 System.out.println("Can't be divided.");
  53.             }
  54.             System.out.println();
  55.         }
  56.     }
  57.     public static boolean search(int part, int[] marbles) {
  58.         int[] flg = new int[part + 1];
  59.         flg[0] = 1;
  60.         for (int i = 0; i < 6; i++) {
  61.             for (int j = 1; j <= marbles[i]; j++) {
  62.                 int base = j * (i + 1);
  63.                 if (base > part) {
  64.                     break;
  65.                 }
  66.                 for (int k = part - (i + 1); k >= base - i - 1; k--) {
  67.                     if (flg[k] != 0) {
  68.                         flg[k + i + 1] = 1;
  69.                     }
  70.                     if (flg[part] != 0) {
  71.                         return true;
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.         return flg[part] != 0;
  77.     }
  78. }
原创粉丝点击