题目描述:

一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3。

输入:

存在多组数据,每组数据一定行为一个正整数n(n<=64),第二行为n个数字。当n为0时,测试结束。

输出:

输出最大值m。

样例输入:
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
样例输出:
4
2
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;class Main
{public static final boolean DEBUG = false;public static int N = 100;public BufferedReader cin;public PrintWriter cout;public StreamTokenizer tokenizer;public int[] numArr;public int n, sum;public boolean[] vis;public void init(){try {if (DEBUG) {cin = new BufferedReader(new InputStreamReader(new FileInputStream("d:\\OJ\\uva_in.txt")));} else {cin = new BufferedReader(new InputStreamReader(System.in));}cout = new PrintWriter(new OutputStreamWriter(System.out));tokenizer = new StreamTokenizer(cin);} catch (Exception e) {e.printStackTrace();}}public String next(){try {tokenizer.nextToken();if (tokenizer.ttype == StreamTokenizer.TT_EOF)return null;else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {return String.valueOf((int) tokenizer.nval);}return null;} catch (Exception e) {e.printStackTrace();return null;}}public boolean input(){String s = next();if (s == null) return false;n = Integer.parseInt(s);if (n == 0) return false;numArr = new int[n];vis = new boolean[n];sum = 0;for (int i = 0; i < n; i++) {numArr[i] = Integer.parseInt(next());sum += numArr[i];}return true;}public boolean Try(int m) {if (sum % m != 0) return false;Arrays.fill(vis, false);return dfs(sum / m, m, m, 0);}public boolean dfs(int cnt, int max, int re, int s){if (cnt == 0) return true;if (re == 0) {//找到一个组合的值为maxreturn dfs(cnt - 1, max, max, 0);}for (int i = s; i < n; i++) {if (vis[i] || re - numArr[i] < 0) continue;vis[i] = true;if (dfs(cnt, max, re - numArr[i], i + 1)) return true;vis[i] = false;//剪枝在找到一个组合的值为max后,接下来的不能成立if (re - numArr[i] == 0) break;//剪枝在无法找到构成maxif (max == re) break;//剪枝在未选择时,跳过相同的while (i + 1 < n && numArr[i + 1] == numArr[i]) i++;}return false;}public void solve(){Arrays.sort(numArr);for (int start = 0, end = numArr.length - 1; start < end; start++, end--) {int tmp = numArr[start];numArr[start] = numArr[end];numArr[end] = tmp;}int m = numArr[0];while (!Try(m)) m++;cout.println(sum / m);cout.flush();}public static void main(String[] args){Main solver = new Main();solver.init();while (solver.input()) {solver.solve();}}
}

题目1251:序列分割(DFS+剪枝)相关推荐

  1. BZOJ 1251: 序列终结者( splay )

    先orz一下clj...我的splay跟着他写的... 这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了... ------------------ ...

  2. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  3. BZOJ3675 [APIO2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  4. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  5. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  6. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  7. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  8. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  9. 牛客算法周周练17D - 刺客信条(dfs剪枝 | 优先队列 + bfs)

    题目大意: 给出一张n * m的地图,每经过一个建筑都需要一定的时间,而经过ABC要花费100,要求输出从S到E的最短时间. 解题思路: 思路一:dfs剪枝 输入地图的时候用char输入,然后转成in ...

最新文章

  1. [Java入门笔记] Java语言基础(四):流程控制
  2. 007_ServletConfig
  3. Java基础—反射—简单介绍
  4. P2756,ssl2601-飞行员配对问题【网络流24题,最大匹配,dinic】
  5. [Vue.js] 基础 -- 安装Vue
  6. python+selenium自动化driver.switch_to.frame用法
  7. 测试线程池(Java)
  8. linuxt gogs搭建
  9. 冒险岛如何修改服务器wz,冒险岛怎么WZ修改攻击力说好了加100分
  10. 网络协议TCP/IP、IPX/SPX、NETBEUI简介
  11. PowerPoint2007文件格式
  12. 计算机专业英语 9次作业合集 从第九次到第一次
  13. 计算机串口通信的作用,串口通信的具体用途是什么
  14. CSU oj 1681 Adjoin(dfs求树上最长路径)(搜索)
  15. 清华博士生被开除:告诉孩子,不吃学习的苦,就要吃生活的苦
  16. SQL数据库快照删除
  17. java基础,进阶(二)
  18. 教育技术学跟计算机专业,我是教育技术学专业可以报计算机专业吗?
  19. MS-DOS基本操作汇总
  20. Word2010的基本操作

热门文章

  1. python快速编程入门例题-Python快速编程入门,打牢基础必须知道的11个知识点 !...
  2. 学python语言用什么软件-对于自学python的初学者来说,应该使用什么编辑工具?...
  3. python爬虫数据分析可以做什么-自学Python爬虫学到什么程度?就可以去找工作了?...
  4. python菜鸟工具-第一行Python代码之菜鸟逃离记
  5. python编写的软件界面-用Python写一个带图形界面的文件压缩软件
  6. python编程爱心-使用Python画出小人发射爱心的代码
  7. python基础单词-学Python必背的初级单词,快来看看学吧
  8. 成都python培训比较好的机构-成都Python培训班哪个好,怎样才能不走弯路学习
  9. 案例驱动python编程入门-用Python进行行为驱动开发的入门教程
  10. python零基础怎么学-python 零基础该怎么学?