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. ASP.NET CORE中判断是否移动端打开网页

    using Microsoft.AspNetCore.Http;using System;using System.Collections.Generic;using System.Text;usin ...

  2. vue项目eslint环境配置与vscode配置eslint

    eslint基础环境搭建 全局安装eslint:npm install eslint -g 项目eslint初始化:eslint --init,按团队或自己的编程风格回答三道题. ? How woul ...

  3. IntelliJ IDEA 中文乱码配置

    总共有下面几种乱码的解决方案: 工程乱码 执行main函数时,控制台乱码 运行tomcat时,控制台乱码 PS: 如果下面方案不生效时,打开IDEA安装目录找到 idea.exe.vmoptions( ...

  4. Git 目录

    linux通过用户名.密码提交的方式搭建私有git服务端 centos 6.5 6.6 6.7安装gitlab教程(社区版) Git 初始化项目.创建合并分支.回滚等常用方法总结 Git 错误集锦

  5. Java如何从服务器获取文件大小?

    在Java编程中,如何从服务器获取文件大小? 以下示例演示如何从服务器获取文件大小. package com.yiibai; import java.net.URL; import java.net. ...

  6. Ubuntu16.04安装xgboost

    1.Python下安装方法 git clone --recursive https://github.com/dmlc/xgboost cd xgboost make -j4 cd python-pa ...

  7. Go的微服务库kite

    Kite Kite是用Go开发的一套RPC库,很适合作为分布式微服务的开发框架. Kite 的传输层使用 SockJS 提供的WebSocket服务, 浏览器Javascript也可以连接到Kite上 ...

  8. [Converge] Weight Initialiser

    From: http://www.cnblogs.com/denny402/p/6932956.html [, ] fully connected w = tf.Variable(tf.truncat ...

  9. [IR] Arithmetic Coding

    Statistical methods的除了huffman外的另一种常见压缩方式. Huffman coding的非连续数值特性成为了无法达到香农极限的先天无法弥补的缺陷,但Arithmetic co ...

  10. [Laravel] 09 - Functional models

    Laravel框架下的若干常用功能实现. 文件上传 邮件发送 缓存使用 错误日志 队列应用 文件上传 一.配置文件 功能 配置 [config/filesystems.php] 'disks' =&g ...