DFS(剪枝) POJ 1011 Sticks
/*
题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度;
DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全!
剪枝主要在4和5:4 相同长度的木棍不再搜索;5 若新的搜索连第一条都没组合出来,直接break;
详细解释:http://blog.csdn.net/lyy289065406/article/details/6647960
http://www.cnblogs.com/devil-91/archive/2012/08/03/2621787.html
这题虐我千百遍,我待她如。。 656K 0MS 博客随笔第100篇,纪念一下:)
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
using namespace std; const int MAXN = ;
const int INF = 0x3f3f3f3f;
int a[MAXN];
bool vis[MAXN];
int sum;
int n, cnt; bool cmp(int x, int y)
{
return x > y;
} bool DFS(int len, int ans, int num, int s)
{
if (num == cnt) return true; int pre = -;
for (int i=s; i<=n; ++i)
{
if (vis[i] || a[i] == pre) continue; //Cut 4 vis[i] = true;
if (ans + a[i] < len)
{
if (DFS (len, ans + a[i], num, i) == true) return true;
else pre = a[i];
}
else if (ans + a[i] == len)
{
if (DFS (len, , num+, ) == true) return true;
else pre = a[i];
}
vis[i] = false; if (ans == ) break; //Cut 5
} return false;
} int main(void) //POJ 1011 Sticks
{
//freopen ("POJ_1011.in", "r", stdin); while (scanf ("%d", &n) == && n)
{
sum = ; memset (vis, , sizeof (vis));
for (int i=; i<=n; ++i)
{
scanf ("%d", &a[i]); sum += a[i];
}
sort (a+, a++n, cmp); //Cut 1 bool flag = false;
for (int i=a[]; i<=sum-i; ++i) //Cut 2
{
if (sum % i == ) //Cut 3
{
cnt = sum / i;
if (DFS (i, , , ) == true)
{
flag = true;
printf ("%d\n", i); break;
}
}
}
if (!flag) printf ("%d\n", sum);
} return ;
} /*
6
5
*/
DFS(剪枝) POJ 1011 Sticks的更多相关文章
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- POJ 1011 Sticks 【DFS 剪枝】
题目链接:http://poj.org/problem?id=1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
- OpenJudge 2817:木棒 / Poj 1011 Sticks
1.链接地址: http://bailian.openjudge.cn/practice/2817/ http://poj.org/problem?id=1011 2.题目: 总时间限制: 1000m ...
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
- POJ 1011 Sticks(dfs+剪枝)
http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...
- POJ 1011 Sticks dfs,剪枝 难度:2
http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...
- poj(1011)——Sticks(经典的dfs+剪枝)
题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...
随机推荐
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(二)
DEMO1:当我们点击启动服务时和点击停止服务的时候,观察服务的运行状态,布局由于简单,只是两个普通的Button按钮,在此我只上截图. java代码部分 第一步:我们需要实现一个服务类,继承自ser ...
- Codeforces Round #FF (Div. 2) C. DZY Loves Sequences
解题报告:输入一个数列,选取一个子数列,要求最多只能改动这个子数列中的一个数,使得这个子数列是严格的升序的(严格升序没有相等的) 我的做法是,第一步把这个 数列的每个升序的子数列都找出来,然后看这些子 ...
- Linux守护进程的启动方法
导读 “守护进程”(daemon)就是一直在后台运行的进程(daemon),通常在系统启动时一同把守护进程启动起来,本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后 ...
- HDU3344(小广搜+小暴力
Kakuro Extension Extension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- chrome控制台支持多行js模式
shift + 回车 是换行 转自: http://zhidao.baidu.com/link?url=MYjGRwvVQYJwnr38VTHPJdzRNtF1COyqpeuAtBYbxFYJcu6p ...
- Segment Tree Modify
For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in thi ...
- C++代码重用——包含
#ifndef PAIRS_H #define PAIRS_H #include <iostream> #include <valarray> template <cla ...
- 利用cocostudio库函数 实现左右滑动的背包栏UI (cocos2d-x 2.2.0)
.h #ifndef __COMMON_COMPONENTS__ #define __COMMON_COMPONENTS__ #include "cocos2d.h" #inclu ...
- CodeForces - 405C
Unusual Product Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...