题目描述

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

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

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

输入输出格式

输入格式:

输入文件共有二行。

第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65

(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)

第二行为N个用空个隔开的正整数,表示N根小木棍的长度。

输出格式:

输出文件仅一行,表示要求的原始木棍的最小可能长度

输入输出样例

输入样例#1: 复制

9
5 2 1 5 2 1 5 2 1
输出样例#1: 复制

6

说明

2017/08/05

数据时限修改:

-#17 #20 #22 #27 四组数据时限500ms

-#21 #24 #28 #29 #30五组数据时限1000ms

其他时限改为200ms(请放心食用)

思路:各种优化的搜索。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,mx,sum;
int num[],vis[];
int cmp(int a,int b){
return a>b;
}
void dfs(int ans,int s,int goal,int now){
if(s*goal==sum){ printf("%d",goal); exit(); }
if(sum-ans<num[m]) return ;
if(ans==goal){ dfs(,s+,goal,);return ; }
for(int i=now;i<=m;i++){
if(!vis[i]&&num[i]+ans<=goal){
vis[i]=;
dfs(ans+num[i],s,goal,i+);
vis[i]=;
if(ans+num[i]==goal||ans==) break;
while(num[i]==num[i+]) i++;
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
if(x>) continue;
num[++m]=x;sum+=x;
mx=max(mx,x);
}
sort(num+,num++m,cmp);
for(int i=mx;i<=sum/;i++)
if(sum%i==)
dfs(,,i,);
printf("%d",sum);
}

最新文章

  1. Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
  2. hammer用法 jquery.hammer.js
  3. 如何在LIRE搜索中使用多特征
  4. Android IPC机制之Messenger
  5. 贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)
  6. Python 实现粒子滤波
  7. Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
  8. MSDE简介
  9. C#使用原生的Directx和OpenGL绘图
  10. eclipse gradle 自动打包
  11. jQuery骨架
  12. 日志管理 rsyslog服务浅析
  13. HIdernate入门
  14. QT---系统托盘图标不显示原因
  15. 《JAVA与模式》之命令模式
  16. 【Alpha阶段】第四次scrum meeting
  17. Oracle 存储过程简单语法
  18. STM32CubeMX+Keil裸机代码风格(1)
  19. Spring框架的四大原则
  20. ECONOMETRICS CHAPTER1

热门文章

  1. phonegap+cordova+ionic调用原生API
  2. C# 清除coockies
  3. .ignore配置问题1:配置后所忽略的文件不起作用
  4. android 蓝牙 通信 bluetooth
  5. Python随笔-快排
  6. 1A课程笔记分享_StudyJams_2017
  7. 图解TCP/IP笔记(3)——IP协议
  8. 移动web——轮播图
  9. CNN结构:色温-冷暖色的定义和领域区分(一)
  10. .net core 使用 textSharp生成pdf