PKU 1011
来源:互联网 发布:天刀好看的捏脸数据 编辑:程序博客网 时间:2024/06/05 18:04
#include <iostream>#include <algorithm>#include<fstream>#include<string.h >#define MAXN 64using namespace std;int N, LEN, M; //LEN为原始棍子长度, M为原始棍子数量 int S[MAXN], MK[MAXN];bool FLAG; int cmp(int a, int b){ return a > b;}void dfs(int k, int sum, int cnt){ if (cnt == M)//当前个数为棒子的个数 FLAG = true; else if (sum == LEN) dfs(0, 0, cnt+1);//有cnt个棒子的长度为len,即为所需要的长度 else for (int pre = -1, i = k; i < N; i++) if (!MK[i] && S[i]!=pre && S[i]+sum<=LEN) { pre = S[i]; MK[i] = true;//MK[]数组将已经遍历的棒子进行记录,下一次访问时,跳过这根棒子,对下一根棒子进行查找,搜索 dfs(i+1, sum+S[i], cnt); MK[i] = false; if (k == 0 || FLAG) return; }}int main(){ int sum, i; freopen("data_sticks.txt","r",stdin); while (scanf("%d", &N) != EOF && N) { FLAG = false; sum = 0; for (i = 0; i < N; i++) { scanf("%d", &S[i]); sum += S[i]; } sort(S, S+N, cmp);//将S[]数组从大到小排序,以此得到在得到长度的最小值之后跳出循环 cout<<S[0]<<endl; for (LEN = S[0]; LEN < sum; LEN++) if (sum % LEN == 0) { M = sum / LEN;//棒子的长度都相等,在这里求出棒子的个数 memset(MK, 0, sizeof(MK)); dfs(0, 0, 0); if (FLAG)//在得到最小值后直接跳出循环 break; } printf("%d\n", FLAG? LEN : sum); } return 0;}
0 0
- pku 1011
- PKU 1011
- PKU 1011
- PKU 1011 Sticks
- pku 1011 sticks
- pku 1011(dfs)
- pku 1011 解题报告
- pku 1011 解题报告
- pku 1011 sticks
- pku 1011 sticks
- pku 1011 sticks
- PKU 1011 Sticks
- PKU ACM 1011 Sticks
- pku+acm+1011
- PKU ACM 1011 Sticks
- PKU-1011 Sticks (DFS + 剪枝)
- 北大PKU在线测试1011
- pku 1011 sticks 经典DFS+剪枝
- 在VMware workstation 9中如何查看和更改虚拟机的网卡MAC地址?
- jQuery插件 -- 表单验证插件jquery.validate.js
- Gallery 相册分享底层实现
- 黑马程序员 Java加强--类加载器
- c/c++学习01
- PKU 1011
- oracle数据库执行脚本时常用命令总结
- 基址与分段寻址—32位寄存器的变化
- Shell下的通配符、特殊符号和文件描述符
- JBPM4.4(三)——与SSH的集成运用
- ubuntu android installscript
- eclipse和VS2010版快捷键
- 如何恢复手机“恢复出厂设置”文件呢
- Linux下程序的加载、运行和终止流程 .