Sticks POJ - 1011 少林神棍 dfs四次剪枝
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四次剪枝的更多相关文章
- Sticks(poj 1011)
题目描述: Description George took sticks of the same length and cut them randomly until all parts became ...
- poj 3373 Changing Digits (DFS + 记忆化剪枝+鸽巢原理思想)
http://poj.org/problem?id=3373 Changing Digits Time Limit: 3000MS Memory Limit: 65536K Total Submi ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- 【POJ 1011】 Sticks
[题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
随机推荐
- Swift 静态派发和动态派发
前言 方法是 Swift 中的一个重要概念,方法允许你把需要复用的代码封装进方法中,这样当你调用方法时,实际上你的想法是执行方法中的那些代码,方法的出现极大的提高了方法的复用性. Swift 工程的环 ...
- 将自己写的HDL代码封装成带AXI总线的IP
将自己写的HDL代码封装成带AXI总线的IP 1.Tools->create and package IP 2.create AXI4总线的IP 3.新建block design 4.点击右键, ...
- python 的正则表达式
在python中,对正则表达式的支持是通过re模块来支持的.使用re的步骤是先把表达式字符串编译成pattern实例,然后在使用pattern去匹配文本获取结果. 其实也有另外一种方式,就是直接使用r ...
- Brainfuck反汇编(Python)
global cs global ip global ss #global sp global ds global bp global tab global out #cs='++++++++++[& ...
- 根据IP获取国家
国外的还算比较权威的IP地址库,而且免费,每天调用次数不超过1000免费.超过另收费. public string Ip2Country(string ip) { try { string url = ...
- Visual Studio TFS Branching and Merging Guidance
Origin URL:https://msdn.microsoft.com/en-us/magazine/gg598921.aspx Bill Heys and Willy-Peter Schaub ...
- 嵌入式开发之精确延时---多线程延时阻塞精度asm("nop") nanosleep usleep sleep select
http://blog.csdn.net/lile777/article/details/45503087
- eclipse java ee jsp tomcat Server文件夹给删了,怎么办?
右键 选择属性 选择Switch location 就可以了
- 树莓GPIO &&python
from http://www.cnblogs.com/xiaobo-Linux/p/8969324.html 命令行控制LED灯 echo 12 > /sys/class/gpio/ex ...
- SpringBoot 拦截器(Interceptor)的使用
拦截器intercprot 和 过滤器 Filter 其实作用类似 在最开始接触java 使用struts2的时候,里面都是filter 后来springmvc时就用interceptor 没太在意 ...