【题目概括】

现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍。

请你最小化拼成后的长度。

【思路要点】

  • 考虑枚举最后的长度,然后判断是否可以,这样就不需要最优性剪枝了。
  • 每一次\(dfs\)我们从大到小放置木棍,这样可以更快的逼近答案。
  • 迭代的时候记录上次放置的长度和已经放置的木棍长度。
  • 从小到大,找到答案就可以exit掉了。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>

#define FI first
#define SE second
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef long double ld;

template <class T> void chkmax(T& x, T y) { x = max(x, y); }
template <class T> void chkmin(T& x, T y) { x = min(x, y); }

namespace input {
  template <class T>
  void read(T& x) {
    x = 0; char ch = 0; int f = 1;
    for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
    for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    x *= f;
  }
  void re(int& x) { read(x); }
  void re(ll& x) { read(x); }
  void re(ull& x) { read(x); }
  void re(char& x) { x = getchar(); }
  void re(string& x) { cin >> x; }
}
using namespace input;

namespace output {
  template <class T>
  void write(T x) {
    if (!x) { putchar('0'); return; }
    if (x < 0) putchar('-'), x = -x;
    static int top, stk[25]; top = 0;
    while (x) stk[++top] = x % 10, x /= 10;
    while (top) putchar(stk[top--] + 48);
  }
  void pr(int x) { write(x); }
  void pr(ll x) { write(x); }
  void pr(ull x) { write(x); }
  void pr(char x) { putchar(x); }
  void pr(string x) { cout << x; }
  void pp() { putchar(' '); }
  void ps() { puts(""); }
}
using namespace output;

const int N = 105;

int n, mx, mi, sum, need;
int a[N], buk[N];
bool flg = 0;

void dfs(int rest, int nowLen, int lastChose) {
  if (!rest) {
    pr(need), pr('\n');
    flg = 1;
    return;
  }
  if (nowLen == need) {
    dfs(rest - 1, 0, mx);
    return;
  }
  for (int i = lastChose; i >= mi; i--) {
    if (flg)
      return;
    if (buk[i] && nowLen + i <= need) {
      buk[i]--;
      dfs(rest, nowLen + i, i);
      buk[i]++;
      if (!nowLen || nowLen + i == need)
        break;
    }
  }
}

void solve() {
  memset(buk, 0, sizeof buk);
  sum = mx = 0; flg = 0; mi = inf;
  for (int i = 1, x; i <= n; i++) {
    re(x), sum += x, buk[x]++, chkmax(mx, x), chkmin(mi, x);
  }
  for (int i = mx; i <= sum / 2; i++)
    if (sum % i == 0) {
      need = i;
      dfs(sum / i, 0, mx);
      if (flg)
        break;
    }
  if (!flg)
    pr(sum), pr('\n');
}

int main() {
  while (1) {
    re(n);
    if (!n)
      return 0;
    solve();
  }
  return 0;
}

【POJ1011】Sticks的更多相关文章

  1. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

  2. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  3. 【POJ 1011】 Sticks

    [题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...

  4. 【Uva 307】Sticks

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

  5. 【转】欧拉回路&特殊图下的哈密顿回路题集

    转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...

  6. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  7. HDU 5914 Triangle 【构造】 (2016中国大学生程序设计竞赛(长春))

    Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  8. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  9. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

随机推荐

  1. sql sever 两数据表差异比较EXCEPT、INTERSECT

    1.概念: EXCEPT主要是用来获取两个结果集的差:两个结果用EXCEPT链接,返回第一个结果集不在第二个结果集中的数据. INTERSECT主要是用来获取两个结果集的交集:两个结果用INTERSE ...

  2. Mongo数据库备份

    安全访问状态下 手动在线备份: mongodump -h 127.0.0.1:27017 -u=username -p=123456 -d dbname -o /home/backups 手动恢复: ...

  3. python协程gevent案例:爬取斗鱼美女图片

    分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图: 圈住的部分是我们需要 ...

  4. Java设计模式七种写法

    懒汉模式-线程不安全 public class Singleton { private static Singleton instance; private Singleton (){ } publi ...

  5. Threadlocal线程本地变量理解

    转载:https://www.cnblogs.com/chengxiao/p/6152824.html 总结: 作用:ThreadLocal 线程本地变量,可用于分布式项目的日志追踪 用法:在切面中生 ...

  6. jquery的ajax方法使用application/json出现400错误码的解决方案

    400说明是客户端错误,将contentType默认的application/x-www-form-urlencoded改成application/json就出现错误,说明传输的数据不是JSON. 解 ...

  7. 导入excel-uploadify+npoi

    总结: 导入文件时一定要给database设置栏位 虚拟表的栏位名称可以与数据库表不一致,但顺序一定要一致,因为它是按照顺序依次插入的 sheet.FirstRowNum = 0; sheet.Fir ...

  8. 前端框架:Angular React 和 Vue的比较

    前端这几年的技术发展很快,细分下来,主要可以分成四个方面: 1.开发语言技术,主要是ES6&7,coffeescript,typescript等: 2.开发框架,如Angular,React, ...

  9. IDEA + SpringBoot + maven 项目文件说明

    Springboot + maven + IDEA + git 项目文件介绍 1..gitignore  分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应 ...

  10. HTTPS中SSL/TLS握手时的私钥用途(RSA、ECDHE)

    从上一篇HTTPS中CA证书的签发及使用过程中知道服务端在申请CA证书时只上交了密钥对中的公钥,那么只有服务端知道的私钥有什么作用呢? SSL/TLS层的位置 SSL/TLS层在网络模型的位置,它属于 ...