排序之后再剪枝,有点神

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 200010
#define INF 0x7fffffff
#define inf 10000000
#define ull unsigned long long
#define ll long long
using namespace std; int a[65], n;
bool vis[65];
bool cmp(int a, int b)
{
return a > b;
}
bool dfs(int cc, int now, int aim, int k, int cur)
{
// printf("*****%d***%d***\n", now, cur);
if(cur == cc) return true;
for(int i = k; i < n; ++ i)
{
//if(i && !vis[i-1] && a[i] == a[i-1]) continue;
if(!vis[i] && a[i] < now)
{
vis[i] = 1;
if(dfs(cc, now-a[i], aim, i+1, cur)) return true;
vis[i] = 0;
if(now == aim) //第一个棒如果用不到,显然不能成功,直接结束
return false;
}
else if(!vis[i] && a[i] == now)
{
vis[i] = 1;
if(dfs(cc, aim, aim, 0, cur+1)) return true;
vis[i] = 0;
return false; //因为棒从大到小排,如果无法成功,直接结束
}
}
return false;
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
int _max = 0, sum = 0, ans;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; ++ i)
{
scanf("%d", &a[i]);
_max = max(_max, a[i]);
sum += a[i];
}
sort(a, a+n, cmp);
for(int i = _max; i <= sum; ++ i)
{
if(sum%i == 0 && dfs(sum/i - 1, i, i, 0, 0))
{
ans = i;
break;
}
}
printf("%d\n", ans);
}
return 0;
}

uva 307的更多相关文章

  1. Sticks(UVA - 307)【DFS+剪枝】

    Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大 ...

  2. UVa 307 - Sticks

    Sticks  [题目链接]:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category ...

  3. POJ 1011 / UVA 307 Sticks

    中文题 (一般都比较坑) 思路:DFS (感谢学长的幻灯片) 这破题把我折腾惨了!!!搞了n天 // by Sirius_Ren #include <cstdio> #include &l ...

  4. 紫书 习题7-14 UVa 307(暴搜+剪枝)

    这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法 ...

  5. 【Uva 307】Sticks

    [Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solut ...

  6. hduoj 1455 && uva 243 E - Sticks

    http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...

  7. Fast Matrix Operations(UVA)11992

    UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...

  8. HTTP 的重定向301,302,303,307(转)

    HTTP 的重定向301,302,303,307(转) (2012-12-11 11:55:04) 转载▼ 标签: 杂谈 分类: 网络 301 永久重定向,告诉客户端以后应从新地址访问.302 作为H ...

  9. HTTP状态码302、303和307的故事

        今日读书,无法理解HTTP302.303.307状态码的来龙去脉,决定对其做深究并总结于本文.       <HTTP权威指南>第3章在讲解30X状态码时,完全没有讲清楚为什么要有 ...

随机推荐

  1. 一个简单的获取参数的jqure

    今天做项目的时候需要用到上一页面传递过来的参数(只要一个参数),其解决办法就是下面: char latter=location.search.split('=')[1] 以上直接获取到第一个参数的值为 ...

  2. Linux相关指令

    Linux相关指令 1.find文件搜索功能 find [目录列表] [匹配参数] [匹配标准] -name :按文件名称进行搜索 -group :按文件所属组进行搜索 -user :按文件拥有者进行 ...

  3. hdu 1102 Constructing Roads Kruscal

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:这道题实际上和hdu 1242 Rescue 非常相似,改变了输入方式之后, 本题实际上更 ...

  4. 南阳理工ACM975--关于521

    http://acm.nyist.net/JudgeOnline/problem.php?pid=975 这是我的源码.一直超时,一直超时. 还有itoa函数函数的使用.可以改成sprintf(str ...

  5. SecureCRT相关设置

    Technorati 标签: SecureCRT,设置 1.  使用SecureCRT对Linux vim进行颜色设置 Linux的控制台颜色很好设置:Options ->Session Opt ...

  6. int * const 与 const int * 的区别

    type * const 与 const type * 是在C/C++编程中特别容易混淆的两个知识点,现在就以 int * const 和 const int * 为例来简略介绍一下这两者之间的区别. ...

  7. Python's Exception 层级结构

    BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration ...

  8. 控制反转 (inversion of control)

    The inversion of control (IoC) pattern is abstract; it says that one should move dependency creation ...

  9. 在线生成ICO图标、站标

    网上一搜有很多,找了两个比较好用的,分别是http://ico.storyren.com/和http://www.ico.la/,前面的那个好像更好点.上传png.jpg.或gif格式的图片,按自己需 ...

  10. ADO.NET笔记——使用Command执行增删改操作,通过判断ExecuteNonQuery()返回值检查是否操作成功

    相关知识: ExecuteNonQuery()方法:执行CommandText属性所制定的操作,返回受影响的记录条数.该方法一般用来执行SQL中的UPDATE.INSERT和DELETE等操作 对于U ...