题意:

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50,个数不超过65。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

思路:搜索+减枝。  至于复杂度,很难计算,反正疯狂减枝就对了。

sum为总长度和,那么我们从小到大枚举sum的因子,验证是否成立。

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int vis[maxn],a[maxn],N,L;
bool dfs(int left,int now,int pos)
{
if(left==&&now==) return ;//终止
if(now==) { now=L; pos=; }
for(int i=pos+;i<=N;i++){
if(vis[i]||a[i]>now) continue; //不符合
if(!vis[i-]&&a[i]==a[i-]) continue; //减枝1
vis[i]=;
if(dfs(left-,now-a[i],i)) return ;
vis[i]=;
if(a[i]==now||now==L) return ; //减枝2
}
return ;
}
int main()
{
int sum,ans;
while(~scanf("%d",&N)&&N){
sum=;
for(int i=;i<=N;i++) vis[i]=;
for(int i=;i<=N;i++){
scanf("%d",&a[i]);
if(a[i]>) {
i--; N--;
}
else sum+=a[i];
}
sort(a+,a+N+);
for(int i=;i<=N/;i++) swap(a[i],a[N+-i]);
ans=sum;
for(L=a[N];L<=sum;L++){
if(sum%L!=) continue;
if(dfs(N,L,)){
ans=L; break;
}
}
printf("%d\n",ans);
}
return ;
}

最新文章

  1. Debian 8(Jessie) 安装自带Mysql
  2. servlet和http请求
  3. 如何查看Python的内置函数
  4. left join与on,where 结合一起用的异同
  5. uva 10555 - Dead Fraction)(数论)
  6. HDU 5735 - Born Slippy
  7. SVNKit getFileFromSVN
  8. LeetCode:1. Add Two Numbers
  9. Nginx日志切割案例讲解,Nginx的知识讲解
  10. PHP中的错误处理机制
  11. Hive-ORC文件存储格式(续)
  12. 响应消息的内容类型 text/html; charset=utf-8 与绑定(application/soap+xml; charset=utf-8)的内容类型不匹配。
  13. Beta 冲刺(1/7)
  14. Numpy中的广播原则(机制)
  15. 递归删除服务器log文件
  16. [Localization] MobileNet with SSD
  17. Winform 设置控件值
  18. 数据结构入门之链表(C语言实现)
  19. 20155320 Exp6 信息搜集与漏洞扫描
  20. ubuntu 命令安装软件

热门文章

  1. 【记录】【mysql】的REPLACE()用法
  2. css3写下雨效果
  3. 对decimal 类型的数据进行获取调整
  4. PHP表单select中有0选项的处理
  5. [转帖]美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout
  6. drf源码系列
  7. Linux基础(10)AIO项目设计与POSIX文件操作和目录管理
  8. Go MongoDB官方数据库驱动之增删改查
  9. [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4) 帧类型和格式
  10. 【转】ISE——完整工程的建立