http://poj.org/problem?id=1011

题意:若干根棍子被截成小段的木棒,现在给你这些木棒,问最短可以拼出的棍子长度。

题解:搜索,dfs(r,m) 二个参数分别代表还剩r个木棒,当前棍子还剩m长度。

从dfs(N,L)搜到dfs(0,0)停止。

棍子从大到小排序

从小到大枚举L

四个剪枝

0.考虑木棒大多都一样长的特殊情况。

多余的枚举:

“如果某个木棒在当前棍子不能用,那么之后必定会用到”

1.第一个木棒回溯时(由于后续无法继续拼接导致不能用),后面总归会还是要把它作为 某棍的第一棒(因为它是第一个也就说明是最长的) 来处理的。所以直接跳到下一种长度。

2.最后一个木棒回溯时(由于后续无法继续拼接导致不能用),试图将其用短棒子代替并得到一解。那么这个木棒可以通过与短木棒们交换来获得另一个之前判掉的解。产生矛盾。

“顺序枚举"

3.前后木棒长短顺序。如果短的在长的前面,说明长的在前面的情况已经被判掉了,当然,长的在前面的情况里必然已经包括了先长后短的情况。

坑:用rep模板的时候,全局变量写在rep里面会被定义成局部的orz 不但里面用不了,循环后也会丢失最后循环结束的数据。

#define _CRT_SECURE_NO_WARNINGS
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<string>
#include<stack>
#include<ctime>
#include<list>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<sstream>
#include<iostream>
#include<functional>
#include<algorithm>
#include<memory.h>
//#define INF 0x3f3f3f3f
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mp make_pair
#define pb push_back
#define mmm(a,b) memset(a,b,sizeof(a))
//std::ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void smain();
#define ONLINE_JUDGE
int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
smain();
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return ;
}
const int maxn = 4e5 + ;
const ll mod = 1e7 + ;
const ll INF = ()*(200000ll) + ;
int N, L;
int vis[];
int totallen = ;
int last;
vector<int>anlength;
stack<int >temp;
bool dfs(int r, int m) {
if (r == && m == ) {
return true;
}
if (m == )
{ m = L; }
int start = ;
if (m!= L) start = last + ;
rep(i, start, N-) {
if (!vis[i] && anlength[i] <= m) {
if (i > ) {
if (vis[i - ] == && anlength[i] == anlength[i - ])continue;//consider all length is same
} vis[i] = ; last = i;//consider order
if (dfs(r - , m - anlength[i])) {return true; } else {
vis[i] = ;
if (anlength[i] == m||L == m)return false; //某长度下, 某根棍子的第一根木棒不能用,说明这根木棒废了,直接换下一个长度。
//if (anlength[i] == m)return false;//最后一根木棒不能用,直接换下一个长度。
}
}
}
return false;
} string s;
int a, b, c,ans;
void Run() {
rep(i, anlength[], totallen/) {
L = i;
if (totallen%L)continue;
mmm(vis, );
if (dfs(N, L)) {
cout << L << endl;
return;
}
}
{
cout << totallen << endl;
}
} void smain() {
while (cin >> N) {
if (N == )break;
totallen = ;
anlength.clear();
rep(j, , N) {
int n;
cin >> n;
anlength.push_back(n);
totallen += n;
}
sort(anlength.begin(), anlength.end(),greater<int>()); Run();
} }

Sticks POJ - 1011 少林神棍 dfs四次剪枝的更多相关文章

  1. Sticks(poj 1011)

    题目描述: Description George took sticks of the same length and cut them randomly until all parts became ...

  2. poj 3373 Changing Digits (DFS + 记忆化剪枝+鸽巢原理思想)

    http://poj.org/problem?id=3373 Changing Digits Time Limit: 3000MS   Memory Limit: 65536K Total Submi ...

  3. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  4. POJ 1011 - Sticks DFS+剪枝

    POJ 1011 - Sticks 题意:    一把等长的木段被随机砍成 n 条小木条    已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析:    1. 该长度必能被总长整除    ...

  5. POJ 1011 Sticks 【DFS 剪枝】

    题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissio ...

  6. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  7. OpenJudge 2817:木棒 / Poj 1011 Sticks

    1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...

  8. 【POJ 1011】 Sticks

    [题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...

  9. POJ 1321 棋盘问题 --- DFS

    POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...

随机推荐

  1. struts2:多业务方法的处理(动态调用,DMI)

    struts2支持调用指定Action类中某一个业务方法.如果没有指定,则调用execute方法. 1. 第一种实现方式,通过URL叹号参数 1.1 创建Action类,带多个方法 package c ...

  2. [svc]inotify+rsync解决nfs单点问题

    安装配置inotify 参考 yum install inotify* -y [root@n2 shell]# rpm -qa|grep inotify inotify-tools-3.14-8.el ...

  3. jsonp的工作原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 《Essential C++》读书笔记 之 基于对象编程风格

    <Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructor ...

  5. File 类的 getCanonicalFile( ) 和 getAbsoluteFile( ) 区别

    一.打开java.io.File源码,看下两个方法的区别 getAbsoluteFile public File getAbsoluteFile() { String absPath = getAbs ...

  6. Excel中substitute替换函数的使用方法

    问题现象:在Excel中,对几千条数据按照时间顺序排序,但总是有部分数据不参与排序,单纯用单元格调整不起任何作用. 解决办法: 数据排列问题最重要的是数据格式的一致性.解决这个问题,建议按如下步骤: ...

  7. npm WARN unmet dependency错误解决方法

    在MAC上安装webpack以及reactjs等其它组件时,安装太慢卡住不动,直接ctrl+c终止后,再npm install后出npm WARN unmet dependency错误,npm cac ...

  8. BitSet的用法

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数 ...

  9. Login failed for user 'IIS APPPOOL\ASP.NET v4.0'

    Looks like it's failing trying to open a connection to SQL Server. You need to add a login to SQL Se ...

  10. WAS生成的文件:javacore.***.txt 、heapdump.***.phd、core.***.dmp、Snap.***.trc

    WAS生成的常见文件有哪些? 原文链接:http://blog.csdn.net/pqh20085101092/article/details/39370389 javacore.***.txt : ...