很经典的搜索题,直接爆搜会卡在连续相同长度的木棍,可以先排序,预处理该长度不行直接跳下一长度木棍的位置

但此题特殊,木棍长度小于50,我们可以直接桶排序

还有就是关于回溯的理解:

我们写的dfs为的是判断ans是否可行,可行解自然已经被记录下来了,并且一路return即,若回溯到了相同or类似情况,说明必定不能符合题意

TIPS:桶排序+可行性剪枝

 package poj.ProblemSet;

 import java.util.Scanner;

 public class poj1011 {
public static final int MAXN = 100;
public static int[] bucket = new int[MAXN];
public static int ans, flag, sum, maxn, minn; public static void dfs(int res, int sum, int p) {
if (res == 0||flag==1) { flag = 1;return; }
if (sum == ans) { dfs(res - 1, 0, maxn);return;}
for (int i = p; i >= minn; i--) {
if (bucket[i]>0 && i + sum <= ans) {
bucket[i]--;
dfs(res, sum + i, i);//(*)
bucket[i]++;
if (sum == 0 || sum + i == ans) break;
//执行此句说明(*)行尝试失败,因此到达当前情况的搜索均可剪枝
}
}
} public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for (int n = cin.nextInt(); n != 0; n = cin.nextInt()) {
sum = flag = maxn = 0;minn = MAXN;
for (int i = 0; i < MAXN; i++) bucket[i] = 0;
for(int i=1;i<=n;i++) {
int temp = cin.nextInt();
bucket[temp]++;
sum += temp;
maxn = Math.max(maxn, temp);
minn = Math.min(minn, temp);
}
int INF = sum / 2;
for (int i = maxn; i <= INF; i++)
if (sum % i == 0) {
ans = i;
dfs(sum / i, 0, maxn);
if(flag==1)break;
}
if (flag == 1) System.out.println(ans);
else System.out.println(sum);
}
}
}

Java-POJ1011-sticks的更多相关文章

  1. poj1011 Sticks (搜索经典好题)

    poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly ...

  2. POJ1011 Sticks

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  3. poj1011 Sticks(dfs+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110416   Accepted: 25331 Descrip ...

  4. poj1011 Sticks(DFS+剪枝)

    题目链接 http://poj.org/problem?id=1011 题意 输入n根棍子的长度,将这n根棍子组合成若干根长度相同的棍子,求组合后的棍子的最小长度.这题是poj2362的加强版,思路与 ...

  5. poj1011 Sticks[剪枝题]

    https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...

  6. poj-1011 sticks(搜索题)

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  7. poj1011 Sticks (dfs剪枝)

    [题目描述] George took sticks of the same length and cut them randomly until all parts became at most 50 ...

  8. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  10. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

随机推荐

  1. 使用mongoose--写接口

    定义数据模型 import mongoose from 'mongoose' mongoose.connect('mongodb://localhost/edu') const advertSchem ...

  2. JavaDay10(上)

    Java learning_Day10(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA&g ...

  3. 2.Docker Compose 部署应用程序

    部署 Tomcat version: '3.1' services:  tomcat:   restart: always   image: tomcat   container_name: tomc ...

  4. MySql 小表驱动大表

    在了解之前要先了解对应语法 in 与 exist. IN: select * from A where A.id in (select B.id from B) in后的括号的表达式结果要求之输出一列 ...

  5. mysql执行顺序及左连接和右连接

    SELECT语句执行顺序 SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行: 开始->FROM子句-& ...

  6. Windows2008r2、正版安装包

    最近发现有很多人找我要Windows  2008的安装包,为了方便,就分享在这儿一下,有需要的自行下载. 链接:https://pan.baidu.com/s/1YZFE7FxL8O_gtfAftcX ...

  7. 2017-9-15Opencv 杂

    Mat::at()的具体含义.指的是三通道.(0),(1),(2)分别表示BGR: Vector<Mat>结构的使用.将Mat类型的数据转化成了具有多个单通道的容器? 灰度图的具体含义.和 ...

  8. tensorflow expand_dims和squeeze

    有时我们会碰到升维或降维的需求,比如现在有一个图像样本,形状是 [height, width, channels],我们需要把它输入到已经训练好的模型中做分类,而模型定义的输入变量是一个batch,即 ...

  9. [P4450] 双亲数 - 莫比乌斯反演,整除分块

    模板题-- \[\sum\limits_{i=1}^a\sum\limits_{j=1}^b[(i,j)=k] = \sum\limits_{i=1}^a\sum\limits_{j=1}^b[k|i ...

  10. Selenium3+python自动化009- 多选框

    多选框 # 随机选择多选框# sports=driver.find_elements_by_name("sport")# maxnum=len(sports)# num=rando ...