题目大意:有一堆木棍 由几个相同长的木棍截出来的,求那几个相同长的木棍最短能有多短?

深搜+剪枝 具体看代码

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
int N,M;
int A[100],Max=-1,Sum,NN;
int visit[100];
bool cmp(int a,int b)
{
return a>b;
} void input()
{
memset(visit,0,sizeof(visit));
Max=-1;Sum=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&A[i]);
if(A[i]>Max) Max=A[i];
Sum+=A[i];
}
}
int dfs(int now,int nown,int pos)
{
int ok=0;
if(nown==NN) return 1;
for(int i=pos+1;i<=N;i++)
{
if(visit[i]==0)
{
if(now+A[i]<=M)
{
visit[i]=1;
if(now+A[i]==M) ok=dfs(0,nown+1,0);
else ok=dfs(now+A[i],nown,i); //剪枝1 次要剪枝
visit[i]=0;
if(ok) return 1;
if(now==0) return 0; //剪枝2 必须剪枝 now==0 表示这是一个新的一根但i却依旧不能加进去
// 在新的一根中都不能满足,说明未来所有的木棍中都没有他的容身之所,直接return 0;本题精华所在
while(A[i]==A[i+1]) i++; //剪枝3 次要剪枝 如果这个不满足的话,与他相同的也不可能满足这根
}
}
}
return 0;
}
void solve()
{
sort(A+1,A+N+1,cmp);
for(int i=Max;i<=Sum;i++)
{
if(Sum%i==0)
{
memset(visit,0,sizeof(visit));
M=i;
NN=Sum/i;
if(dfs(0,0,0)) {
printf("%d\n",M);
break;
}
}
}
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main()
{
// init();
while(cin>>N&&N!=0)
{
input();
solve();
}
}

【深搜加剪枝】【HDU1455】【Sticks】的更多相关文章

  1. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  2. 一本通例题埃及分数—题解&&深搜的剪枝技巧总结

    一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ...

  3. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. 深搜+DP剪枝 codevs 1047 邮票面值设计

    codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description ...

  5. 深搜的剪枝技巧(三)——Sticks(可行性剪枝、上下界剪枝、最优性剪枝)

    小木棍(最优性剪枝.可行性剪枝) 一.问题描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,已知每段的长都不超过 50 .现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ...

  6. HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  7. POJ-1190-生日蛋糕(深搜,剪枝)

    生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23049 Accepted: 8215 Description 7月1 ...

  8. ROADS POJ - 1724 约束最短路 暴搜 加剪枝

    http://poj.org/problem?id=1724 题意:最短路的模板,不过每条边加上一个费用,要求总费用不超过k 题解:不能用dijkstra ,直接暴力,dfs维护len和cost. 普 ...

  9. HDU 6196 happy happy happy 爆搜加剪枝

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6196 题意:给你长度为n的序列,爸爸和儿子玩一个游戏,儿子先手,儿子每次都选择最左边与最右边最大的那个 ...

随机推荐

  1. Ffmpeg和SDL创建线程(转)

    Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functi ...

  2. 提交App,请求Apple加急审核

    转载自:http://blog.csdn.net/showhilllee/article/details/19541493 提交完毕后进入加急审核页面. 链接:https://developer.ap ...

  3. 多线程:pthread_exit,pthread_join,pthread_self

    /*exit_join_id.c*/ #include<pthread.h> #include<stdio.h> void* eji(void* agr) { printf(& ...

  4. RMAN数据库恢复之恢复表空间和数据文件

    执行表空间或数据文件恢复时,数据库既可以是MOUNT状态,也可以是OPEN状态.1.恢复表空间在执行恢复之前,如果被操作的表空间未处理OFFLINE状态,必须首先通过ALTER TABLESPACE… ...

  5. java中List的用法

    list的添加删除等操作 import java.util.*; class TestList { public static void main(String[] args) { List<S ...

  6. <runtime> 的 <assemblyBinding> 元素

    一.<assemblyBinding> 元素 包含有关程序集版本重定向和程序集位置的信息. <assemblyBinding xmlns="urn:schemas-micr ...

  7. 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用

    <html> <head> <meta http-equiv="Content-Type" Content="text/html; char ...

  8. java学习——函数

    class FunctionDemo { public static void main(String[] args) { System.out.println("Hello World!& ...

  9. hdu2399GPA

    Problem Description Each course grade is one of the following five letters: A, B, C, D, and F. (Note ...

  10. HDU 5768 - Lucky7

    题意: 给出x, y, m[1...n], a[1..n].     在[x,y]中寻找 p % 7 = 0 且对任意(1<= i <=n) p % m[i] != a[i] 的数字的个数 ...