【Uva 307】Sticks
【Link】:
【Description】
给你最多n个棍子;
(n< = 64)
每根棍子长度(1..50)
问你这n根棍子,可以是由多少根长度为x的棍子分割出来的;
x要求最小
【Solution】
首先,将各根棍子的长度求和->sum
最后的长度x肯定是sum的因子;
则枚举x从各根棍子长度的最大值到sum作为因子;
枚举量假设为len;
然后一直用剩余的棍子去凑这个长度len
凑够了,就重新选择剩下的棍子,继续凑len;
剪枝:
1.还需要凑的量为len,但是尝试用完某根棍子之后,无法凑够,则直接return,因为表示有一根棍子不能够被加入到最后的答案中
2.剩余的棍子长度为sum,然后发现第一根尝试的棍子不能凑够,同理也退出
3.一根棍子用了之后,发现不行,则不再用这根棍子凑了,把相同的棍子跳过
4.从大到小排序,这样剪枝的效果会快一些出现
【NumberOf WA】
1
【Reviw】
凑够一根,然后继续凑;
(再从1开始);
记录之前用过哪一根;
没凑够的话,就从下一根根子开始;
【Code】
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 64;
int l[N+20],n,sum,now,vis[N+20];
bool dfs(int pre,int need,int rest){
if (rest==0) return true;
for (int i = pre;i <= n;i++)
if (!vis[i] && l[i]<=need){
vis[i] = 1;
if (l[i]==need && dfs(1,now,rest-l[i]))
return true;
else if ( dfs(i+1,need-l[i],rest-l[i]))
return true;
vis[i] = 0;
if (rest==sum) return false;
if (need==now) return false;
while (i+1<=n && l[i+1]==l[i]) i++;
}
return false;
}
int main(){
//freopen("F:\\rush.txt","r",stdin);
while (~scanf("%d",&n)){
if (n==0) break;
sum = 0;
for (int i = 1;i <= n;i++)
scanf("%d",&l[i]),sum+=l[i];
for (int i = 1;i <= n;i++) vis[i] = 0;
sort(l+1,l+1+n);
reverse(l+1,l+1+n);
int ans = sum;
for (now = l[1];now < sum;now++)
if (sum%now==0){
if (dfs(1,now,sum)){
ans = now;
//printf("%d\n",now);
break;
}
}
printf("%d\n",ans);
}
return 0;
}
【Uva 307】Sticks的更多相关文章
- 【Uva 10003】Cutting Sticks
[Link]: [Description] 给你一根长度为l的棍子; 然后有n个切割点; 要求在每个切割点都要切割一下; 这样,最后就能形成n+1根小棍子了; 问你怎样切割,消耗的体力最小; 认为,消 ...
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【POJ 1011】 Sticks
[题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
随机推荐
- 纯CSS实现小圆点和三角形图案
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 7、java封装、继承、聚合组合
1封装:封装的是属性,封:private 装:set.get‘ 可以看做将属性和get/set方法捆绑的过程. 优点:1.防止对封装数据的未经授权的访问,提高安全性.使用者只能通过事先预定好的方法来访 ...
- 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)
ndk编译C++.提示找不到头文件(ndk-build error: string: No such file or directory) 被这个问题弄得愁眉苦脸啊.心想为啥一个string都找不到呢 ...
- NUTCH2.3 hadoop2.7.1 hbase1.0.1.1 solr5.2.1部署(一)
Precondition: hadoop 2.7.1 Nutch 2.3 hbase 1.0.1.1 / hbase 0.98.13 solr 4.8.1 Linux version 3.16. ...
- 智课雅思词汇---八、ject是什么意思
智课雅思词汇---八.ject是什么意思 一.总结 一句话总结:词根:ject, jac(jet) = to throw(投掷, 扔) 1.geo是什么意思? 词根:-ge-, -geo- [词根含义 ...
- PHP str_replace() 和str_ireplace()函数
PHP str_replace() 和str_ireplace()函数 实例 把字符串 "Hello world!" 中的字符 "world" 替换为 &quo ...
- [USACO09JAN] 气象测量/气象牛The Baric Bovine 解题报告(DP)
题目链接:https://www.luogu.org/problemnew/show/P2933 Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N &l ...
- python 3.x 学习笔记5 (装饰器)
1.装饰器: 本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则: 1)不能修改被装饰的函数的源代码 2)不能修改被装饰的函数的调用方式 2.实现装饰器知识储备: 1)函数即“变量” 2)高 ...
- 使用Java操作Redis(一)
Redis是一款基于key-value的数据库服务器,安装完成后我们可以通过redis-cli使用Redis提供的命令完成各种操作.redis-cli实际上就是一款客户端,和redis-server建 ...
- iview2.0 父组件访问子组件 方法
//从父组件中访问子组件 可以给子组件定义标识 通过ref="chead" 定义 通过父组件就可以访问了