六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 146|回复: 0

pku1011 Sticks

[复制链接]

升级  86%

9

主题

9

主题

9

主题

童生

Rank: 1

积分
43
 楼主| 发表于 2013-2-7 20:36:13 | 显示全部楼层 |阅读模式
一直没想好怎么搜索,所以一直没写,最近看到一段细节写得非常好的代码,于是把这道题AC了,感觉这段搜索写得灰常强大,短而效率高
#include <cstdio>#include <algorithm>#include <functional>using namespace std;const int maxN = 64 + 5;int n, stick[maxN], len, m;bool used[maxN] = {false}, done;void dfs(int k, int now, int cnt){if (cnt == m)done = true;else if (now == len)dfs(0, 0, cnt + 1);else {int pre = -1;for (int i = k; i < n; ++i)if (!used && stick != pre && now + stick <= len){used = true;pre = stick;dfs(k + 1, now + stick, cnt);used = false;if (k == 0 || done)return;}}}int main(){while (scanf("%d", &n), n > 0){int sum = 0;for (int i = 0; i < n; ++i){scanf("%d", &stick);sum += stick;}sort(stick, stick + n, greater<int>());done = false;for (len = stick[0]; len <= sum; ++len)if (sum % len == 0){m = sum / len;dfs(0, 0, 0);if (done)break;}printf("%d\n", len);}return 0;}

原代码的地址是
http://www.cnblogs.com/lotus3x/archive/2008/07/25/1251552.html
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表