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调试通过.程序简洁,优美。
组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数组合数...
本篇文章将深入讲解如何用C语言计算组合数,并提供一个简单的C程序示例。 首先,我们要理解组合数的公式。组合数可以用阶乘的形式表示为 C(n, m) = n! / (m!(n-m)!), 其中"!"代表阶乘,即一个正整数n的阶乘是所有...
例如,如果你正在编写一个解决排列组合问题的程序,或者需要分析概率分布,你可以方便地将`Combinations`函数嵌入到主程序中,以计算特定的组合数。 为了进一步优化,你可以考虑缓存之前计算过的阶乘值,以避免重复...
了解递归和动态规划等方法来计算组合数是解决此类问题的基础,也是提升编程能力的重要一环。 总之,组合数问题是数学与计算机科学的交汇点,递归和动态规划等方法为我们提供了高效解决问题的工具。在面对复杂问题时...
根据给定的文件信息,我们可以总结出以下关于“计算组合数”的相关知识点: ### 一、组合数概念 组合数是指从n个不同元素中选取m(m≤n)个元素的方法数目,记作C(n, m)或者\( \binom{n}{m} \)。在数学中,组合数...
在MFC中实现组合数计算,我们可以创建一个MFC工程,通常是一个对话框应用程序。首先,我们需要一个用户界面来接收输入的数据n和k。这可以通过在对话框上添加两个编辑框(CEdit控件)和一个按钮(CButton控件)来实现...
组合数算法是计算机科学中一个重要的概念,它是指从n个元素中选取r个元素的所有可能组合。组合数算法广泛应用于计算机科学、数学、统计学等领域。 递归思想是组合数算法的核心思想。递归算法设计是要找出大规模问题...
组合数的MATLAB实现,注意看注释,其中有参数的定义神马的,大家共享哦。
在计算组合数的问题中,我们可以定义两个递归函数,一个是当k=0或k=n时的基础情况,另一个是处理一般情况的递归步骤。这两个递归函数可以这样表示: 1. 基本情况: - 如果k=0或k=n,则C(n, k) = 1,因为此时只有一...
从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 ...
组合数,又称二项式系数,是离散数学中的一个重要概念,在计算机科学中有着广泛的应用。这个主题通常出现在算法设计、概率论、图论以及密码学等领域。在本题中,我们需要编写一个程序,能够根据用户的需求反复计算并...
在编程领域,组合数(Combination Number)是一个重要的数学概念,尤其在计算机科学中的算法设计和数据结构中占据着核心地位。组合数通常用C(n, m)表示,表示从n个不同元素中不重复地选取m个元素的方法数。在MFC...
算出从n个不同元素中取出m个元素(m≤n)的组合数。 建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),以空格分隔。 输出格式: ...
C语言程序设计-编写main程序调用函数fact求解从m个元素选n个元素的组合数的个数;计算公式是: 组合数=m!(n!.(m-n)!);要求m不能小于n,否则应有容错处理;说明:函数fact(x)的功能是求x!;
1998年大专数学建模竞赛中便提出了一道关于蛋白质分子分解和氨基酸组合数的题目,题目中探讨了在有无计算机两种情况下,如何通过数学建模解决这一生物化学问题。 在没有计算机辅助的条件下,研究人员首先建立了用于...
动态规划是一种解决这类问题的有效方法,它通过构建一个二维数组`dp`来存储到目前为止计算出的所有可能的组合数。数组的行代表目标金额,列代表使用过的钱币类型。`dp[i][j]`表示组成金额`i`使用`j`种钱币的组合数...
组合数,使用函数递归调用,求解思路清晰,是很好的范本