`
poower
  • 浏览: 18065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

DP算法求组合数

阅读更多
中学就学过排列,组合 ,比如 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;
}
//*********************************************************************************
注:其实我没看明白......
分享到:
评论

相关推荐

    AcWing算法基础课模板大全

    基础算法 —— 代码模板链接 常用代码模板1——基础算法 排序 二分 高精度 前缀和与差分 双指针算法 位运算 离散化 区间合并 数据结构 —— 代码模板链接 常用代码...数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心

    建议收藏算法基础课模板大全

    基础算法 —— 代码模板链接 常用代码模板1——基础算法 排序 二分 高精度 前缀和与差分 双指针算法 位运算 离散化 区间合并 数据结构 —— 代码模板链接 常用代码...数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心

    ACM 算法模板集

    7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. 稳定婚姻匹配 16. 后缀数组 17. 左偏树 18. 标准RMQ-ST 19. 度限制最小生成树 ...

    ACM算法模板和pku代码

    组合数计算(double) 组合数计算(高精度) r-组合生成算法 r-排列生成算法 r-错位排列生成算法 图论 传递闭包 欧拉回路判定 有向图欧拉路径 二分图最大匹配 匈牙利算法 二分图最大匹配 HK算法 二分图最大权...

    常用算法代码

    | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 ...

    上海交通大学ACM算法模板

    7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. 稳定婚姻匹配 16. 后缀数组 17. 左偏树 18. 标准RMQ-ST 19. 度限制最小...

    算法基础课程:算法备赛学程

    算法基础课程 算法准备赛学程序目标:1.基础算法分级二分高精度垂直和与差分双指针算法位置运算离散化区间合并 ...背包问题线性DP区间DP计数类DP数位统计DP状态压缩DP树形DP记忆化搜索 6.贪心 7.时空复杂度分析

    leetcode中国-leetcode_algo:leetcode相关算法和模板使用python

    数位统计DP 状态压缩DP 树形DP 记忆化搜索 贪心 时空复杂度分析 提高知识点 动态规划——从集合角度考虑DP问题 1.1 数字三角形模型 1.2 最长上升子序列模型 1.3 背包模型 1.4 状态机模型 1.5 状态压缩DP 1.6 区间DP ...

    ACM新手算法书

    组合数学 容斥原理 母函数 polya定理 搜索 A*搜索 IDA* 搜索 搜索的优化 STL相关 c++·list c++·stack & queue & priority_queue c++·set c++·map 其他语言 博弈论 巴什博弈 威佐夫博奕 Nim博弈 SG函数

    leetcode中国-leetcode:力码

    leetcode中国 LeetCode | LuoGu 题型记录 ...组合的输出(求组合数(置位的遍历方向)) P1706 全排列问题(next_permutation, dfs(最主要需要记住,置位后需要清0(f[i]=0))) P3392 涂国旗(组合) P23

    matlab找出第1500个约数只有2,3,5的整数

    如前十个这样的数是1,2,3,4,5,6,9,10,12,15 即这个数的约数只能是2,3,5这三个数的组合或相乘。除此以外,它没有其他约数。 简单的DP算法

    leetcode中文版-Algorithm:力码

    组合数(全排列) Array 90 求数组子集(含重复元素) Array 152 最大子数组乘积 DP 165 版本号比较 String 165 偷东西 DP 219 重复元素判断 Array 234 回文链表判断 LinkedList 234 DFS路径 DFS 434 字符串分段数 ...

    leetcode和oj-leetcode-1:Leetcode.com上的算法问题

    这个文件夹包含一些有趣的算法问题和我的解决方案。 Leetcode OJ 网址: 目前已解决:67 问题清单 问题(按字母顺序) 困难 频率 笔记 3sum 3 5 数组,两个指针 添加二进制 2 4 字符串,两个指针,数学 添加两个数字...

    IOI国家集训队论文集1999-2019

    张伟达 -《用改进算法的思想解决规模维数增大的问题》 黄 刚 -《数据结构的联合》 杨 弋 -《从“小H的小屋”的解法谈算法的优化》 朱晨光 -《浅析倍增思想在信息学竞赛中的应用》 李羽修 -《Hash函数的设计优化...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    1100 Mondriaan s Dream 简单题,DP可以过,不过据说有复杂的组合公式 1103 Hike on a Graph 简单题 1134 Strategic Game 简单题 1147 Formatting Text 简单题 1148 The Game 简单题 1161 Gone Fishing ...

    leetcode分类-acm:算法导论

    组合和排列 数学题 一个算法问题包含三部分:输入、输出和解。 输入数据结构可以是数组、字符串、树、喜欢的列表、矩阵等。 用于解决问题的算法可以是动态规划、BFS 和 DFS。 也可以是数据结构,如堆、栈、散列集、...

    leetcode中文版-DataStructureAlgorithmsJava:常见数据结构及算法(Java语言描述)

    求数 搜索 图 LeetCode 反转 二叉树 二叉查找树 二分查找 双指针 滑动窗口 数据结构设计 位运算 回溯(DFS) + 剪枝 排列 组合 分割 子集 棋盘 路径 广度优先搜索(BFS) 数组 链表 哈希表 字符串 排序 贪心 动态规划(DP...

    leetcode岛屿面积-fq_algorithm_practice:FQ的算法数据结构练习

    电话号码的组合 bfs(广度优先遍历) 单词接龙 岛屿数量 binarysearch(二分搜索) 二分查找 寻找旋转排序数组中的最小值 design(设计) LRU doublepointer(双指针) 三数之和 两数之和II输入有序数组 无重复字符的最长...

    ACM巨全模板 .pdf

    7.dp[i]=min(dp[i+1]…dp[i+k]),multset 博弈: 1.NIM博弈 (n堆每次最少取一个) 2.威佐夫博弈(两堆每次取至少一个或一起取一样的) 3.约瑟夫环 4.斐波那契博弈 (取的数依赖于对手刚才取的数) 5.sg函数 数论: 1.数论 ...

    leetcode1004-AlgorithmClass:算法课实验

    考虑最后一个数会和哪些数组合, 写出动态规划的公式即可, 不需要使用高精度,unsigned long long可以过 1008 1008的第一问和1009一样,第二问需要用到Dilworth分割定理:要求出最长不上升子序列的最少划分数,只...

Global site tag (gtag.js) - Google Analytics