题目要求:
求满足从1开始,某一整数以内的数组合相加等于其本身的各种情况
例如:整数20,求组合相加等于20的情况:
1 19
1 2 17
1 2 3 14
1 2 3 4 10
1 2 3 5 9
1 2 3 6 8
1 2 4 13
.
.
.
7 13
8 12
9 11
不能重复,交换顺序视为同一种情况。
package alibaba;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class combination {
static int count = 0;
public static void combine(int index,int sum,Set<Integer> set){
if(set== null){
set = new HashSet<Integer>();
}
if( index < sum/2){//递归入口,sum如果能分成两个比index都大的数则进行递归,否则此轮递归结束,回溯继续运行。
int i = index + 1;
int temp = 0;
set.add(index);
if(sum%2 == 0){
temp = sum /2;
}else temp = sum/2 +1;
count++;
System.out.print(count+": ");
for (Integer integer : set) {
System.out.print(integer+" ");
}
System.out.println(sum);
for(;i<temp;i++){//temp为中间值,循环变量无法到达这一值,避免重复情况
set.add(i);
combine(i, sum-i,set);
set.remove(i);
}
}
else{
set.add(index);
set.add(sum);
count++;
System.out.print(count+": ");
for (Integer integer : set) {
System.out.print(integer+" ");
}
System.out.println();
set.remove(index);
set.remove(sum);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两个整数");
int index = scanner.nextInt();
int sum = scanner.nextInt();
for(int i=index; i <sum/2; i ++){
combine(i,sum-i,null);
}
System.out.println("方案总数为:"+count);
}
}
输出结果:
请输入两个整数
1
20
1: 1 19
2: 1 2 17
3: 1 2 3 14
4: 1 2 3 4 10
5: 1 2 3 5 9
6: 1 2 3 6 8
7: 1 2 4 13
8: 1 2 4 5 8
9: 1 2 4 6 7
10: 1 2 5 12
11: 1 2 6 11
12: 1 2 7 10
13: 1 2 8 9
14: 1 3 16
15: 1 3 4 12
16: 1 3 4 5 7
17: 1 3 5 11
18: 1 3 6 10
19: 1 3 7 9
20: 1 4 15
21: 1 4 5 10
22: 1 4 6 9
23: 1 4 7 8
24: 1 5 14
25: 1 5 6 8
26: 1 6 13
27: 1 7 12
28: 1 8 11
29: 1 9 10
30: 2 18
31: 2 3 15
32: 2 3 4 11
33: 2 3 4 5 6
34: 2 3 5 10
35: 2 3 6 9
36: 2 3 7 8
37: 2 4 14
38: 2 4 5 9
39: 2 4 6 8
40: 2 5 13
41: 2 5 6 7
42: 2 6 12
43: 2 7 11
44: 2 8 10
45: 3 17
46: 3 4 13
47: 3 4 5 8
48: 3 4 6 7
49: 3 5 12
50: 3 6 11
51: 3 7 10
52: 3 8 9
53: 4 16
54: 4 5 11
55: 4 6 10
56: 4 7 9
57: 5 15
58: 5 6 9
59: 5 7 8
60: 6 14
61: 7 13
62: 8 12
63: 9 11
方案总数为:63
分享到:
相关推荐
在本项目中,我们主要探讨的是如何利用Java和Spring框架来实现ACM国际大学生程序设计竞赛中的“数字三角形”问题。ACM竞赛是全球知名的编程竞赛,旨在培养学生的算法设计和编程能力。数字三角形问题通常涉及到动态...
标题中的“1道acm题的解(Java源代码)”表明这是一个关于算法竞赛(ACM,全称:International Collegiate Programming Contest)的问题解决方案,使用Java编程语言实现。ACM比赛通常涉及逻辑思维、数据结构和算法设计...
3. **递归思想**:利用递归调用简化问题的求解过程,适用于分治策略的算法实现。 4. **时间与空间复杂度分析**:评估算法效率的关键指标,帮助开发者选择最适合当前问题的算法。 5. **调试技巧**:通过单元测试、...
"ACM.rar"是一个压缩包文件,其中包含了“ACM”这个主题的相关学习资源,包括一些基础练习题和讲解。 "www.pudn.com.txt"可能是一个链接或文本文件,通常在这样的压缩包中,它可能是用来提供更多信息的链接,例如...
【标题】"Problem D.rar" 是一个压缩文件,其中包含了对 ACM(国际大学生程序设计竞赛,简称ACM/ICPC)某道试题的解答。这个压缩包特别关注的是"ACM_ACM试题",暗示了内容可能涉及过去比赛中的一个问题及其解决方案...
【标题】"PKU acm 1000题-2000题" 涉及的是北京大学(PKU)ACM/ICPC(国际大学生程序设计竞赛)训练题目的一部分,这个范围涵盖了从1000题到2000题的解题源代码。在ACM/ICPC中,参赛队伍需要编写程序解决一系列算法...
3. **编程语言**:ACM竞赛通常使用C、C++或Java作为编程语言,熟悉这些语言的基本语法、特性以及如何写出高效代码是必要的。 4. **效率优化**:在比赛中,程序运行时间和空间效率至关重要。因此,选手需要学会如何...
【北大ACM题解答代码】是一份集合了50道北京大学ACM竞赛题目解题思路与源代码的资源,对于想要提升编程技能、学习算法竞赛策略的编程爱好者来说,这是一份非常宝贵的学习资料。ACM(国际大学生程序设计竞赛,...
虽然ACM竞赛不限制编程语言,但C++和Java是最常用的语言,因为它们支持高效的数据结构和算法实现。选手需要熟练掌握语言特性,了解如何编写高效的代码。此外,调试技巧也是必不可少的,包括学会利用编译器的错误提示...
- **熟悉编程语言:** 通常推荐使用C++或Java进行ACM竞赛的编程实践。 - **培养团队协作精神:** ACM竞赛多为团队赛制,良好的沟通与协作是取得好成绩的关键。 #### 二、数据结构基础 在ACM竞赛中,对数据结构的...
在ACM竞赛中,C++和Java是最常用的语言。C++因其高效和灵活性受到青睐,而Java则以其丰富的类库和自动内存管理简化了编程。此外,Python等脚本语言也逐渐在一些简单题目中被采用,因其简洁的语法和快速开发特性。 ...
【北大ACM平台题库源代码】是一个针对编程竞赛爱好者和学习者的宝贵资源,它包含了北京大学ACM(国际大学生程序设计竞赛)平台上的400道题目对应的源代码。这个资源对于想要提升算法理解、训练编程技能以及深入学习...
3. **编程实现**:熟练使用C++、Java等编程语言实现算法。 4. **调试技巧**:掌握快速定位和解决问题的方法。 5. **阅读理解**:提升理解复杂问题和需求的能力。 6. **逻辑思维**:锻炼严密的逻辑推理能力。 这个...
在编程学习的初期,ACM(国际大学生程序设计竞赛,英文为ACM International Collegiate Programming Contest)是一个很好的起点,因为它提供了各种基础到进阶的算法和编程问题。这些题目旨在帮助初学者提升逻辑思维...
这些题目涵盖了计算机科学和算法设计中的多个经典问题,主要涉及逻辑推理、数学建模和算法实现。以下是对各个题目所涉及知识点的详细说明: 1. **N皇后问题**:这是一个典型的回溯法问题,用于寻找在N*N棋盘上放置N...
对于A、E、F题,选手们需要熟练掌握C++、Java或Python等主流编程语言,并了解各种基础及高级算法,例如排序、查找、递归、贪心、动态规划等。同时,良好的团队协作和时间管理也是比赛成功的关键因素。 回顾重庆第一...
ACM,全称是国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC或ACM/ICPC),是一项全球性的编程竞赛,旨在提升大学生的计算机科学问题解决能力,特别是算法设计、分析和编程实现。...
13. **递归问题**:2060题"Fibonacci"又是一道与斐波那契序列相关的题目,同样考验选手对递归和优化算法的理解。 这些ACM题目旨在提高参赛者的编程技巧、算法设计能力和问题解决能力,对于学习计算机科学的学生和...