`
dyccsxg
  • 浏览: 204800 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

一个关于组合数的问题

    博客分类:
  • Java
J# 
阅读更多

1. 题目来源 未解之谜俱乐部

import java.util.ArrayList;
import java.util.List;

/**
 *@date   2010-5-3 下午05:50:30
 *@author dycc
 *@file   NumberMystery.java
 *@desc   给定集合 A = [31,37,8,81,34,39,56,5,41,22,28,67],
 *        以及 x + y + z = 99,其中 x,y,z 属于集合A,
 *        问 x = ?,y = ?,z = ?
 */
public class NumberMystery {
	/**
	 * main 方法
	 * @param args
	 */
	public static void main(String[] args) {
	    Integer[] array = {31,37,8,81,34,39,56,5,41,22,28,67};
	    // step1 对原始数组进行排序
	    swapSort(array);
	    // step2 计算组合数(排列组合)
	    List<Integer[]> list = getGroup(array, 0, 3);
	    // step3 输出结果
	    for(int i=0;i<list.size();i++){
	    	Integer[] arr = list.get(i);
	    	if(sumArray(arr) == 99){
	    		printArray(arr);
	    	}
	    }
	    System.out.println("--- ok ---");
    }
	/**
	 * 交换排序
	 * @param array 原始数组
	 * @return
	 */
	public static Integer[] swapSort(Integer[] array){
		if(array == null || array.length < 2){
			return array;
		}
		// [0,array.length-2]
		for(int i=0;i< array.length - 1;i++){
			// find the min number in [i+1,array.length-1]
			int min = i;
			for(int j= i+1;j<array.length;j++){
				if(array[j] < array[min]){
					min = j;
				}
			}
			if(min > i){
				int tmp = array[i];
				array[i] = array[min];
				array[min] = tmp;
			}
		}
		return array;
	}
	/**
	 * 以 size 为单位进行组合
	 * @param data  原始数据
	 * @param start 起始下标
	 * @param size  组合大小
	 * @return
	 */
	public static List<Integer[]> getGroup(Integer[] data,int start,int size){
		List<Integer[]> list = new ArrayList<Integer[]>();
		// 非法入参
		if(data == null || start < 0 
				|| (data.length - start) < size){
			return list;
		}
		// 计算 size==1 的组合
		if(size == 1){
			for(int i=start;i<data.length;i++){
				list.add(new Integer[]{data[i]});
			}			
			return list;
		}
		// 计算组合数
		for(int i=start;i<data.length - (size-1);i++){			
			List<Integer[]> subList = getGroup(data, i + 1, size - 1);
			for(int j=0;j<subList.size();j++){
				Integer[] item = new Integer[size];
				item[0] = data[i];
				Integer[] subItem = subList.get(j);
				for(int k=0;k<size-1;k++){
					item[k+1] = subItem[k];					
				}
				list.add(item);
			}
		}
		return list;
	}
	/**
	 * 计算数组的和
	 * @param arr
	 */
	public static int sumArray(Integer[] arr){
		int sum = 0;
		for(int i=0;i<arr.length;i++){
			sum += arr[i];
		}
		return sum;
	}
	/**
	 * 打印数组
	 * @param arr
	 */
	public static void printArray(Integer[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			if(i < arr.length -1){
				System.out.print(",");
			}
		}
		// 换行
		System.out.println();
	}
}

 

2.

分享到:
评论

相关推荐

    易语言取元素组合数

    在易语言中,“取元素组合数”是计算组合数的算法实现,这是一个在数学和计算机科学中常见的概念。组合数,也称为二项式系数,在组合数学中占有重要地位,通常表示为C(n, k),表示从n个不同元素中不重复地选择k个...

    组合数问题

    ACM 编程经典题 ——组合数问题!VC6.0调试通过.程序简洁,优美。

    组合数开发教程文档.docx

    组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数...

    算出从n个不同元素中取出m个元素(m≤n)的组合数——C语言代码

    本篇文章将深入讲解如何用C语言计算组合数,并提供一个简单的C程序示例。 首先,我们要理解组合数的公式。组合数可以用阶乘的形式表示为 C(n, m) = n! / (m!(n-m)!), 其中"!"代表阶乘,即一个正整数n的阶乘是所有...

    VB 函数嵌套求组合数

    例如,如果你正在编写一个解决排列组合问题的程序,或者需要分析概率分布,你可以方便地将`Combinations`函数嵌入到主程序中,以计算特定的组合数。 为了进一步优化,你可以考虑缓存之前计算过的阶乘值,以避免重复...

    一个组合数问题(递归完成)

    了解递归和动态规划等方法来计算组合数是解决此类问题的基础,也是提升编程能力的重要一环。 总之,组合数问题是数学与计算机科学的交汇点,递归和动态规划等方法为我们提供了高效解决问题的工具。在面对复杂问题时...

    计算组合数,用C语言编程

    根据给定的文件信息,我们可以总结出以下关于“计算组合数”的相关知识点: ### 一、组合数概念 组合数是指从n个不同元素中选取m(m≤n)个元素的方法数目,记作C(n, m)或者\( \binom{n}{m} \)。在数学中,组合数...

    vc 求组合数 mfc实现组合

    在MFC中实现组合数计算,我们可以创建一个MFC工程,通常是一个对话框应用程序。首先,我们需要一个用户界面来接收输入的数据n和k。这可以通过在对话框上添加两个编辑框(CEdit控件)和一个按钮(CButton控件)来实现...

    组合数算法

    组合数算法是计算机科学中一个重要的概念,它是指从n个元素中选取r个元素的所有可能组合。组合数算法广泛应用于计算机科学、数学、统计学等领域。 递归思想是组合数算法的核心思想。递归算法设计是要找出大规模问题...

    组合数的matlab实现

    组合数的MATLAB实现,注意看注释,其中有参数的定义神马的,大家共享哦。

    用递归法计算从n个正整数中选择k个数的不同组合数

    在计算组合数的问题中,我们可以定义两个递归函数,一个是当k=0或k=n时的基础情况,另一个是处理一般情况的递归步骤。这两个递归函数可以这样表示: 1. 基本情况: - 如果k=0或k=n,则C(n, k) = 1,因为此时只有一...

    从N选取M个数的所有组合数C++描述C++描述

    从N选取M个数的所有组合数C++描述 思路: 第一位可以取N中的任何一个,第二位只能取第一位后面的数字任何一个, 即第M位只能取第M-1位后面的数字任何一个,每一位递归一次

    动态规划求组合数终极版

    对于组合数的计算,我们可以构建一个二维数组dp[n+1][m+1],其中dp[i][j]表示从i个元素中选择j个的方法数。初始化dp[0][0] = 1,因为从0个元素中选0个有且仅有一种方法。然后按照递推关系填充数组: ```python for ...

    输出组合数

    组合数,又称二项式系数,是离散数学中的一个重要概念,在计算机科学中有着广泛的应用。这个主题通常出现在算法设计、概率论、图论以及密码学等领域。在本题中,我们需要编写一个程序,能够根据用户的需求反复计算并...

    求组合数cnm的mfc实现

    在编程领域,组合数(Combination Number)是一个重要的数学概念,尤其在计算机科学中的算法设计和数据结构中占据着核心地位。组合数通常用C(n, m)表示,表示从n个不同元素中不重复地选取m个元素的方法数。在MFC...

    求组合数 (15 分)PTA

    ​​算出从n个不同元素中取出m个元素(m≤n)的组合数。 建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),以空格分隔。 输出格式: ...

    蛋白质分子分解 氨基酸组合数

    标题中的“蛋白质分子分解氨基酸组合数”指的是在数学建模中,如何计算特定分子量的蛋白质可以由哪些氨基酸以何种组合方式构成的问题。描述中提到的1998年大专数学建模题目,探讨了在有无计算机的情况下,通过数学...

    C语言程序设计-编写main程序调用函数fact求解从m个元素选n个元素的组合数的个数;组合数=m!(n!.(m-n)!);

    C语言程序设计-编写main程序调用函数fact求解从m个元素选n个元素的组合数的个数;计算公式是: 组合数=m!(n!.(m-n)!);要求m不能小于n,否则应有容错处理;说明:函数fact(x)的功能是求x!;

    钱币组合方法数的问题

    动态规划是一种解决这类问题的有效方法,它通过构建一个二维数组`dp`来存储到目前为止计算出的所有可能的组合数。数组的行代表目标金额,列代表使用过的钱币类型。`dp[i][j]`表示组成金额`i`使用`j`种钱币的组合数...

    组合数_源码

    组合数,使用函数递归调用,求解思路清晰,是很好的范本

Global site tag (gtag.js) - Google Analytics