中学就学过排列,组合 ,比如 C5,2 = 10; C6,2 = 15
如果用算法实现的话,难道也要先做一连串的乘法,然后再相除吗? 比如: C5,2 = (5*4*3*2)/(3*2)
如果数很大的话,又是乘又做除的,多牛的计算机才能搞定呢?
先看看简单的:
2个数选2个,共有1种方法
3个数选2个,共有3种方法
4个数选2个,共有6种方法
n个数选2个,共有多少种方法?
F(n,2) = F(n-1,2) + F(n-1,1) //这样写看的更清楚些.
那么N个数选M出来,有多少种选择呢?
F(N,M) = F(N-1,M) + F(N-1,M-1)
到此处,DP的递归解空间已经出来了.
F(N,M) = 1 M=0 or N=0 or N=M
F(N,M) = N M=1
F(N,M) = F(N-1,M) + F(N-1,M-1) M!=N 当然N>M
剩下的工作就是程序实现了.但是还有个小问题,就是在DP迭代的过程中是否需要记忆.在这个算法当然需要记忆.
实现的过程中,可以做些小优化,比如N=5 M=3 可以求C5,2的组合数就是要少递归几次.
#include "stdafx.h"
#include <iostream>
using namespace std;
__int64 Aug[200][200] = {0};
__int64 getComposite(int m,int n)
{
__int64 preResult0;
__int64 preResult1;
if (m==0 || n== 0 || m== 1 || m == n)
return 1;
if (Aug[m][n] != 0)
return Aug[m][n];
else
{
preResult0 = getComposite(m-1,n);
Aug[m-1][n] = preResult0;
preResult1 = getComposite(m-1,n-1);
Aug[m-1][n-1] = preResult1;
}
return preResult0 + preResult1;
}
int main()
{
int count;
int m,n;
int m0,n0;
cin >> n >> m;
m0 = m >= n ? m : n;
n0 = m >= n ? n : m;
n0 = m0 - n0 >= n0 ? n0 : m0-n0;
cout << getComposite(m0,n0) << endl;
return 0;
}
//*********************************************************************************
注:其实我没看明白......
分享到:
相关推荐
动态规划是一种强大的算法思想,广泛应用于解决复杂计算问题,如组合数求解。组合数,又称二项式系数,表示从n个不同元素中不重复地选取m个元素的方法数,通常表示为C(n, m)或"n choose m"。在本场景中,我们探讨...
**ACM竞赛与DP算法详解** 在计算机科学领域,ACM(Association for Computing Machinery)国际大学生程序设计竞赛是一项享誉全球的编程比赛,旨在提升大学生的算法设计和问题解决能力。在ACM竞赛中,参赛者需要面对...
在实际应用中,组合数的计算还可以用到更高效的数据结构和算法,如Stirling数、二项式系数的递推关系等。此外,对于大数运算,我们可能需要使用模运算以防止溢出,确保计算结果的有效性。 总的来说,理解和掌握组合...
### NOIP范围内的DP算法详解 #### 一、引言 动态规划(Dynamic Programming,简称DP)作为一种重要的算法思想,在信息学奥林匹克竞赛中占据着举足轻重的地位。特别是对于全国青少年信息学奥林匹克联赛(NOIP)而言...
本资料包“动态规划(dp算法).rar”包含了一份详细的PDF文档,旨在深入探讨这一重要算法。 在学习动态规划时,我们需要理解以下几个核心概念: 1. **最优子结构**:这是动态规划问题的一个关键特征,意味着一个最...
例如,如果一个问题有N个独立的状态,而每个状态只有两种可能性(0或1),那么我们可以用一个大小为N的二进制数来表示所有可能的状态组合,而不是用一个数组存储每个单独的状态。 **状压DP**的核心思想是在每次迭代...
- `dpA[i] = dpB[i+1] + dpB[i+2]`,表示A玩家在数字i时的胜利组合数等于B玩家在i+1和i+2时的胜利组合数之和。 - **初始化状态**: - `dpA[M] = 1`,表示从数字M开始,A玩家直接报出7的情况,只有1种胜利组合。 #...
下面,我们将基于给定的文件信息,深入探讨几种典型的DP算法及其应用场景。 ### 1. 资源问题与01背包问题 资源问题在DP算法中占有一席之地,尤其是**01背包问题**,它是一个经典的例子。在这个问题中,我们有N件...
选择当前元素后,组合数为dp[i-1][j-1],不选择则为dp[i-1][j]。因此,dp[i][j] = dp[i-1][j] + dp[i-1][j-1]。 - 当完成所有迭代后,dp[n][k]即为所需组合数,而dp[n][k]中的所有路径代表所有可能的组合。 除了这...
组合数学在计算机科学,尤其是算法设计和竞赛编程(如ACM,即国际大学生程序设计竞赛)中占据着重要地位。这个领域主要研究如何有效地处理和分析离散对象的组合结构,帮助解决各种优化和计数问题。以下是组合数学的...
数位DP的基本思想是将一个大问题分解为若干个规模较小、相互关联的子问题,并逐个解决这些子问题,最终将子问题的解组合得到原问题的解。在处理与数字位相关的题目时,我们通常会把一个整数看作由每一位数字组成,...
动态规划是一种解决这类问题的有效方法,它通过构建一个二维数组`dp`来存储到目前为止计算出的所有可能的组合数。数组的行代表目标金额,列代表使用过的钱币类型。`dp[i][j]`表示组成金额`i`使用`j`种钱币的组合数...
组合算法是一种在计算机科学中广泛使用的数学方法,用于从给定集合中选择特定数量的元素,而不考虑元素的顺序。这种算法在各种场景下都非常有用,例如在数据处理、优化问题、概率计算以及人工智能等领域。下面我们将...
动态规划(DP)是一种在计算机科学和数学中用于求解最优化问题的算法,它主要应用于多阶段决策过程,能够处理复杂的问题,如路径规划、资源分配、装包问题等。动态规划的核心思想是将一个大问题分解为多个相互关联的...
动态规划dp(常用算法) 动态规划是一种非常重要的算法思想,它可以解决具有重叠子问题和最优子结构性质的问题。动态规划的关键是将原问题划分为若干个子问题,然后通过解决子问题来获得原问题的解。 在解决动态...
贪心算法与动态规划(DP)的区别在于,动态规划会保存和利用之前的状态信息来做出更优的决策,而贪心算法则是在没有回溯的情况下步步为营。在一些情况下,贪心算法可能无法得到全局最优解,而动态规划则可以保证找到...
在这个问题中,我们可以定义一个数组dp,其中dp[i]表示组成i元所需要的组合数。初始状态为dp[0]=1,表示组成0元的组合数为1(即不使用任何硬币)。然后,我们可以遍历所有硬币的面额,更新dp数组,最终dp[10^n]就是...
2. **递推关系**:数字组合问题常常可以通过建立递推关系来解决,例如斐波那契数列、卡特兰数等。通过找出问题背后的递推规则,可以编写程序进行动态规划求解。 3. **数论**:在数字组合中,数论概念如同余、最大公...
4. 母函数( Generating Function ):母函数是分析组合数论中的一种工具,通过将一个序列表示为多项式的形式,可以用来求解序列的性质和递推关系。在ACM竞赛中,母函数可以帮助解决计数问题,比如组合计数、递推...
动态规划的思路可能是创建一个二维数组dp,其中dp[i][j]表示从前i个元素中选取j个的组合数。初始状态下,dp[i][0] = 1(不选任何元素)和dp[0][j] = 0(从空集中选取j个元素是不可能的)。然后,根据组合数的性质,...