【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为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
随机推荐
- Android 手机影音 开发过程记录(六)
前一篇已经将音乐播放及切换的相关逻辑弄好了,今天主要理一下剩余的部分,包含: 1. 自己定义通知栏的布局及逻辑处理 2. 滚动歌词的绘制 3. 歌词解析 效果图 通知栏 自己定义布局: <?xm ...
- Making User-Managed Backups-17.4、Making User-Managed Backups of Online Tablespaces and Datafiles
17.4.Making User-Managed Backups of Online Tablespaces and Datafiles 当数据库打开时,能够备份一个在线表空间全部和一个指定的数据文件 ...
- poj--2385--Apple Catching(状态dp)
Apple Catching Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submi ...
- struts2入门(搭建环境、配置、示例)
转自:https://blog.csdn.net/u012862311/article/details/53412716 1.下载Struts2的jar包 下载地址:http://archive.ap ...
- Linux安装PHP和MySQL
Linux上安装php运行环境稍微比Windows复杂,没有Windows那么方便的集成环境.技术在于折腾嘛 Linux 版本的可以参考之前发布的Linux安装PHP MongoDB扩展 安装环境 系 ...
- caffe命令及其参数解析
caffe的c++主程序(caffe.cpp)放在根目录下的tools文件夹内, 当然还有一些其它的功能文件,如:convert_imageset.cpp, train_net.cpp, test_n ...
- http://www.open-open.com/lib/tag/ReactiveCocoa
http://www.open-open.com/lib/tag/ReactiveCocoa
- 修改MySQL默认字符集
今天发现有库级字符集和表级字符集,实验了下发现,库级字符集是该库内表的默认字符集,当创建表时,如果未指定字符集,默认使用该表所属库的字符集.表也可使用不同于所属库的字符集. MySQL对于字符集的指定 ...
- 洛谷 P1703 那个什么密码2
P1703 那个什么密码2 题目背景 https://www.luogu.org/problem/show?pid=1079 题目描述 与原题一模一样.具体不同请见输入格式 输入输出格式 输入格式: ...
- [Recompose] Make Reusable React Props Streams with Lenses
If you hard-code a stream of props to target a specific prop, it becomes impossible to reuse that st ...