import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main();
}
int count;// 数字个数
int[] a;
boolean[] b;
int L;// 当前匹配长度
public Main() {
Scanner s = new Scanner(System.in);
while (s.hasNextInt()) {
count = s.nextInt();
if (count == 0) {
break;
}
a = new int[count];
b = new boolean[count];
int sum = 0;
for (int i = 0; i < count; i++) {
int num = s.nextInt();
sum += num;
a[i] = num;
}
Arrays.sort(a);
int max = a[count - 1];
// 遍历可能的匹配长度
for (int i : getList(sum)) {
if (max <= i) {
L = i;
if (exec(count - 1, i, sum)) {
System.out.println(i);
break;
}
}
}
}
s.close();
}
public boolean exec(int begin, int left, int all) {
if (left == 0) {
all -= L;
if (all == 0) {
return true;
} else {
left = L;
begin = count - 2;// 从第二个数开始继续匹配,其实可以从第一个可用数开始匹配
}
}
while (begin >= 0) {
if (!b[begin]) {// 可用
int n = a[begin];
if (n <= left) {// 未过界
b[begin] = true;// 假设使用了
if (exec(begin - 1, left - n, all)) {
return true;
} else {
b[begin] = false;// 还原
if (left == L || left == n) {// 如果是首个或末个长度匹配失败,直接退出
break;
}
}
}
while (--begin >= 0 && a[begin] == n) {// 下一个不同的数
}
int tleft = left;// 剩余之和是否足够
for (int j = begin; j >= 0; j--) {
if (!b[j]) {
tleft -= a[j];
if (tleft <= 0) {
break;
}
}
}
if (tleft > 0) {
break;
}
} else {
begin--;
}
}
return false;
}
// 获得所有因子,从小到大排序
public List<Integer> getList(int n) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
list.add(i);
if (i * i != n) {
list.add(n / i);
}
}
}
Collections.sort(list);
return list;
}
}
http://blog.csdn.net/night_blue/archive/2008/09/23/2966056.aspx
比原作者的代码慢100毫秒多
分享到:
相关推荐
这个教程“Simulink建模与仿真”由西安科技大学的姚俊等人编写,旨在深入讲解Simulink在MATLAB中的应用,内容详实,共计1011页,覆盖了Simulink建模和仿真的各个方面。 Simulink是MATLAB的重要扩展,通过拖拽和连接...
S1011-基于51单片机的大气压力温度监测系统+设计+报告+原理图+proteus 功能介绍: 基于51单片机实现温度采集,压力采集,报警,设置报警阈值等功能。 1、通过液晶屏LCD1602显示当前温度值、压力值; 2、可以通过...
S1011-基于51单片机的大气压力温度监测系统+设计+报告+原理图+proteus 功能介绍: 基于51单片机实现温度采集,压力采集,报警,设置报警阈值等功能。 1、通过液晶屏LCD1602显示当前温度值、压力值; 2、可以通过...
本次课题针对于二进制的 2ASK 进行讨论,应用 MATLAB 矩阵实验室进行仿真,分析和修改,通过仿真系统生成一个人机交互界面,以利于仿真系统的操作。通过对系统的仿真,更加直观的了解数字调制系统的性能及影响其性能...
博客地址:https://blog.csdn.net/qq_35654286/article/details/144675582?sharetype=blogdetail&sharerId=144675582&sharerefer=PC&sharesource=qq_35654286&spm=1011.2480.3001.8118 (2)本红外线防盗报警系统由...
透视变换是将三维空间中的点变换到二维图像平面上,模拟人眼观察景物时产生的近大远小的视觉效果。通过这种方式,三维地形被转换成二维图像,以便在计算机屏幕上显示。这一过程依赖于共线方程,即确定了DEM中的三维...
- 整合加速、小规模纳税人政策和增值税率下调等多重因素将推动零售药店业绩亮眼,例如老百姓预计归母净利润增长22%左右。 7. **医疗服务**: - 该领域持续高景气,业务增长势头强劲。 然而,医药行业也面临着...
例如,将二进制数1011转换为十进制,从右向左逐位除以2,得到余数1、1、0、1,然后将余数按顺序逆序排列,即1011,对应十进制数1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 8 + 4 + 0 + 1 = 13。 二、十进制数转换为二进制数 ...
6. **兼容性与升级**:RobotStudio SDK 6.07版本号为7936.1011,意味着它包含了多次更新和优化,确保与不同版本的RobotStudio和ABB机器人控制器的良好兼容性。 7. **示例代码与文档**:通常,SDK会包含丰富的示例...
每个按键的位置可以用一个8位二进制码表示,例如0键的位置码为0111 0111(0X77),5键的位置码为1011 1011(0XBB)。这是因为行线和列线中有一条为低电平,其余为高电平,所以低四位和高四位分别只有一位低电平,...
例如,二进制数1011.101转换为十进制数是通过展开并按照十进制规则求和得到的。 **单片机原理与应用** 单片机是集成在单一芯片上的微型计算机,常用于嵌入式系统。课程中可能详细讲解单片机的结构、指令系统、程序...
UART,即通用异步收发传输器(Universal Asynchronous ...通过分析和实践这个项目,不仅可以提升硬件描述语言的编程技巧,还能增强对串行通信协议的理解,这对于在嵌入式系统设计领域工作的人来说是必不可少的知识。
if(Key_Start==0)//主持人按下抢答键,抢答正式开始! { QiangDa_time=QiangDa_time_temp; HuiDa_time=HuiDa_time_temp; beep(); TR1=1;//抢答时间开始倒计时 break;//跳出犯规抢答查询...
系统通过周期性地改变行扫描信号(例如:1110-1101-1011-0111-1110)来逐行检查,同时读取列线的状态,以确定哪些按键被按下。 例如,当扫描信号为1011时,表示正在检查第7、8、9行的按键状态。如果这一行的按键都...
"记忆"能力强——存储容量大 能进行逻辑判断 运算精度高 支持人机交互——鼠标 极强的通用性——应用于生活的方方面面 1.1.2:计算机的特点与分类 计算机的特点: 1.1.2:计算机的特点与分类 (一)根据计算机的性能...