这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的。
然后参考了别人的博客。发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时。
我也想过这个做法,但是因为觉得肯定超时所以没有写, 我显然没有想到可以这么剪枝
#include<cstdio>
#include<cstring>
#include<functional>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 1123;
int a[MAXN], vis[MAXN], sum, n, start; bool dfs(int cnt, int pos, int sum, int ans)
{
if(cnt == n) return true;
REP(i, pos, n)
{
if(vis[i]) continue;
if(sum + a[i] < ans)
{
vis[i] = 1;
if(dfs(cnt + 1, i + 1, sum + a[i], ans)) return true;
vis[i] = 0;
while(a[i + 1] == a[i] && i + 1 < n) i++;
}
else if(sum + a[i] == ans)
{
vis[i] = 1;
if(dfs(cnt + 1, 0, 0, ans)) return true;
vis[i] = 0;
return false;
}
if(sum == 0) return false;
}
return false;
} int main()
{
while(~scanf("%d", &n) && n)
{
sum = 0;
REP(i, 0, n)
{
scanf("%d", &a[i]);
sum += a[i];
}
sort(a, a + n, greater<int>()); for(int i = n; i > 0; i--)
if(sum % i == 0 && sum / i >= a[0])
{
memset(vis, 0, sizeof(vis));
if(dfs(0, 0, 0, sum / i))
{
printf("%d\n", sum / i);
break;
}
}
} return 0;
}

最新文章

  1. Flask入门1-HelloWorld
  2. UI课堂笔记
  3. hdu 2102 BFS
  4. MATLAB时间序列预测Prediction of time series with NAR neural network
  5. HP-Socket
  6. JPA2.1 中三个提升应用性能的新功能
  7. 提取DLL类库代码
  8. PHP之路——Apache启动失败查看日志
  9. Spark SQL Table Join(Python)
  10. 用Set中元素做条件查询
  11. Java之旅(一)---说说“异常”那些事
  12. HTML5图片上传本地预览
  13. kali syn洪水攻击实例
  14. 07 Python初学(元组)
  15. linux第三次读书笔记
  16. 【POJ3349】snowflakes
  17. HDU 6084 寻找母串(卡特兰数)
  18. 第六章:Reminders实验:第二部分[Learn Android Studio 汉化教程]
  19. LinearLayout布局
  20. 机器学习的5种“兵法&quot;

热门文章

  1. Tensorboard服务激活
  2. 字符识别Python实现 图片验证码识别
  3. JavaScript实验一(添加节点,删除节点)
  4. HDU——T1231 最大连续子序列
  5. spring的关于数据源的datasource接口的深入理解
  6. logstash tcp multihost output(多目标主机输出,保证TCP输出链路的稳定性)
  7. 关于App class loader的总结
  8. web后台知识点整理
  9. ios-UI-汤姆猫德游戏实现
  10. Java-2-学习历程2:基础知识1,2,3文档、完整版视频资源、电子书籍下载