题如下:自然数1,2,3...19这19个数字,使用其中任意组合,使之组合之和为20,
这些数字不能重复使用,不区分先后顺序,求这些组合的个数为多少,请列举出来。
eg:1+19=20,2+18=20,3+7+10=20,1+3+4+5+7=20......
/**
*created by zxb
*Email:zxbxiaobo@sina.com
*date 2010-6-17 - 下午02:34:49
*zxb 开源测试项目 test
*to do TODO
*java version "1.5.0_06"
**/
package com.java.algorism.mycombine;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* 题如下:自然数1,2,3...19这19个数字,使用其中任意组合,使之组合之和为20,
* 这些数字不能重复使用,不区分先后顺序,求这些组合的个数为多少,请列举出来。
* eg:1+19=20,2+18=20,3+7+10=20,1+3+4+5+7=20......;
* 分析:估算这些组合的可能性情况只有在2,3,4,5个数之间数字符号的组合才能完成和为20的数字组合
* 所以把这些排列组合的一一单独列举出来,判断满足组合为20的组合。
* 63
*@author zxb
*/
public class CombineSum extends CombineSelf{
public static void main(String[] args) {
long l1=System.currentTimeMillis();
List<String> list=new ArrayList<String>();
for (int i = 1; i < 20; i++) {
list.add(i+"");
}
for (int i = 2; i < 6; i++) {
NUM=i;
generate(list,new ArrayList<String>());
FILTER=20;
}
filterByValue();
System.out.println("---------最终确定的值--------");
showValue(CombineSelf.set1);
//System.out.println("最终确定的个数--------"+CombineSelf.set.size());//16644
System.out.println("最终确定的个数--------"+set1.size());//63
long l2=System.currentTimeMillis();
System.out.println("最终耗时:"+(l2-l1)+" 毫秒。");
}
}
class CombineSelf {
// 将NUM设置为待排列数组的长度即实现全排列
protected static int NUM = 3;
//排列个数
protected static int COUNT = 0;
//过滤条件值
protected static int FILTER = 20;
//排列组合总个数
protected static Set<String> set=new HashSet<String>();
//排列组合满足条件个数
protected static Set<String> set1=new HashSet<String>();
/**
* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列
*
* @param source
* @param target
*/
protected static void generate(List<String> source, List<String> target) {
Collections.sort(target);
StringBuilder sb=new StringBuilder();
if (target.size() == NUM) {
for (String str : target){
sb.append(str).append(",");
}
sb.setLength(sb.length()-1);
set.add(sb.toString());
return;
}
for (int i = 0, len = source.size(); i < len; i++) {
List<String> newSource = new ArrayList<String>(source);
List<String> newTarget = new ArrayList<String>(target);
newTarget.add(newSource.get(i));
newSource.remove(i);
generate(newSource, newTarget);
}
}
/**
* 展示其值
* @param set
*/
protected static void showValue(Set<String> set){
Iterator<String> it=set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
/**
* 根据条件过滤其值
* @param set
*/
protected static void filterByValue(){
Iterator<String> it=set.iterator();
String[] strArr=new String[NUM];
String temp="";
int sum=0,i=0;
while(it.hasNext()){
temp=it.next();
strArr=temp.split(",");
sum=0;
for ( i= 0, len = strArr.length; i < len; i++) {
sum+=Integer.parseInt(strArr[i]);
}
if(sum==FILTER){
set1.add(temp);
}
}
}
}
分享到:
相关推荐
《疯狂排列组合》是一款专注于排列组合计算的软件,旨在帮助用户高效地理解和计算各种排列组合问题。在数学领域,排列组合是概率论、统计学和计算机科学中的基础概念,广泛应用于数据分析、算法设计以及问题求解等多...
《组合数学》第一章主要介绍了组合数学的基础知识,包括排列组合的基本计数问题、多项式系数的计算及其组合意义以及排列组合算法。组合数学是研究有限集合中元素的不同排列和组合方式的数学分支。 1. 排列组合的...
排列组合是高中数学中的核心知识点,它涉及到统计和概率的基础理论,对于解决实际问题和理论研究都有着重要作用。本文主要归纳了高考中常见的排列组合概念及其应用。 首先,我们需要理解两个基本计数原理:分类计数...
排列组合是高中数学中的一个重要知识点,它涉及到如何有序或无序地排列有限数量的元素。在高考数学冲刺阶段,熟练掌握排列组合的概念及其应用对于提高解题能力至关重要。以下是对题目中涉及的排列组合知识的详细说明...
排列组合是高中数学中的核心知识点,特别是在应对高考数学时,理解和掌握这部分内容至关重要。本章节主要涉及了两个计数原理、排列与组合的概念及其计算公式,以及二项定理的相关知识。 首先,我们要理解两个基本的...
【排列组合】是概率论与数理统计中的基础概念,主要研究如何有序或无序地选取元素的问题。在这些题目中,我们看到了排列和组合的应用。 1. 排列问题涉及的是元素的顺序,比如第1题,选择一个偶数和两个奇数组成三位...
填空题涉及了排列组合的基本应用,如投信方法数、特定项的系数以及数列的求和。 解答题通常更复杂,如第17题要求计算组合问题以确定男女生人数,第18题涉及到多项式展开的系数最值问题,第19题则是排列问题,要求...
【排列组合及二项式定理】是高中数学中的核心概念,主要涉及组合计数和多项式展开。在解决实际问题时,排列和组合的概念帮助我们理解和计算在无序或有序选择中的可能性。 排列指的是从n个不同元素中取出m(m≤n)个...
在小学数学教育中,奥数课程的排列组合是一个极具挑战性的部分,它对于培养学生的逻辑思维和解决实际问题能力具有重要作用。排列组合的学习不仅是对数学知识的拓展,更是一种锻炼学生分析和解决实际问题能力的方式。...
为cxGrid动态附加非绑定(无字段关联)的CheckBox列,以提供用户选择,并对操作者的选择进行求和输出;代码中牵涉到用语句对cxGrid过滤、过滤后的记录关联(定位)数据集数据。如有问题,欢迎到“中国软件研发联盟”...
【排列组合与二项式定理】是高中数学中的核心概念,主要应用于解决涉及顺序和重复计算的问题。在高考复习中,这两个知识点是重点考察对象,尤其在选择和填空题型中。以下是对这些知识点的详细解释: 1. **二项式...
NBS浩辰CAD是一款国产的CAD软件,旨在为用户提供高效、精确的设计工具,其功能强大且易于操作,尤其在求和功能上表现突出。 在工程设计中,尤其是在建筑工程或制造业,设计师经常需要处理大量的数字,例如计算面积...
3. 排列组合的综合应用: 题目4中,涉及到了两个新节目插入原有节目单的不同方式,这需要结合排列和组合的概念。这里分为两类情况,新节目相邻和不相邻,分别使用排列公式A和组合公式C进行计算,然后相加得到总方案...
例如,在讨论衣物搭配时,通过展示不同上衣与裤子的搭配可能,学生可以看到排列组合在日常生活中的应用。而比赛场次的计算则让学生意识到,在多人参与的活动中,每个人都要和其他参与者进行一次对战,从而理解如何...
本篇将深入探讨“易语言数据库字段求和”这一主题,帮助你理解和掌握如何在易语言中实现对数据库字段的求和功能。 首先,我们要理解数据库字段求和的基本概念。在数据库中,字段是指表中的一列,而求和则是指对某一...
1. **加法原理**:加法原理是排列组合中的基本概念,它指出如果完成一件事情可以通过n类不同的方法,其中第一类有m1种方法,第二类有m2种方法,以此类推,第n类有mn种方法,那么完成这件事情的所有方法总数是各类...
设计一个子程序,功能为将R0指向的内部RAM中N个(R1的内容)双字节有符号数进行求和运算。(请说明子程序功能、入口参数、出口参数、占用资源等) 调用上述两个子程序,完成下列2组(16个,32个)双字节有符号数据的...
排列组合是数学中的一个重要领域,而涂色问题作为排列组合中的一个典型应用,不仅能够考查解题者的计数能力,还能有效锻炼解题者的逻辑思维能力。在面对具体的涂色问题时,运用合理的计数原理与策略,是找到问题答案...
"AutoCAD自动求和插件"是针对这款软件开发的一个实用工具,旨在提高工程师和设计师的工作效率,特别是在处理大量尺寸计算时。 该插件的主要功能是自动对AutoCAD图纸中的尺寸进行求和,极大地减少了手动计算的工作量...
在CAD软件中,"CAD数字求和插件"是一款专门为了提高设计人员工作效率而开发的工具。它允许用户在CAD图纸上直接进行数值计算,无需离开设计环境,从而减少了在不同软件间切换的时间消耗。 该插件的安装过程相对简单...