博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划_二项式系数
阅读量:5221 次
发布时间:2019-06-14

本文共 944 字,大约阅读时间需要 3 分钟。

动态规划之二项式系数

@(算法学习)

(nk)=n!(nk)!k!

计算二项式系数的问题在于,系数本身在int表示范围内,但是计算用到的分子是阶乘,这个是很大的数,会导致溢出的问题。

所以,比较好的计算方法是运用帕斯卡三角形总结的规律求解。

这里写图片描述

第一行表达的是:(00)=1

第二行表达的是:(10)=1,(11)=1
第三行表达的是:(20)=1,(21)=2,(22)=1

更有趣的是,每一个数是肩头两个数字之和。

运用的规律是:(nk)=(n1k1)+(n1k)

,这个翻译成中文很好理解。从n个东西中选取k个,在面对第k件东西时,有一个决策,这件不选或者选两条路径。选了第k件则从剩下的n-1件里选k-1件即可。如果不选,就要从剩下的n-1件中选择k件。

这个思想在背包问题中运用的尤其广泛。背包问题是动态规划问题的一种模型,因此,也可以侧面反映动态规划的思想。

#include 
#define MAXN 100long binomial_coefficient(int n, int m)// 从n中选择m { int i,j; long bc[MAXN][MAXN]; //二项式系数表 for(i = 0; i <= n; i++) //帕斯卡三角每行第一个数全是1 { bc[i][0] = 1; } for(j = 0; j <= n; j++) // 帕斯卡三角每行最后一个数全是1 { bc[j][j] = 1; } for(i = 1; i <= n; i++) //状态转移方程 { for(j = 1; j < i; j++) { bc[i][j] = bc[i-1][j-1]+bc[i-1][j]; } } return bc[n][m]; } int main() { int n, m; while(scanf("%d%d",&n,&m)) { int res = binomial_coefficient(n,m); printf("Result = %d\n", res); } return 0; }

转载于:https://www.cnblogs.com/passion-sky/p/9193163.html

你可能感兴趣的文章
比较安全的获取站点更目录
查看>>
读书笔记——乔布斯,做最好的自己,共创式教练
查看>>
ubuontu16.04安装Opencv库引发的find_package()错误信息处理及其简单使用
查看>>
用Linux远程挂载Windows上的共享文件夹.md
查看>>
洛谷 P4317 花神的数论题(组合数)
查看>>
【Python】学习笔记5-利用flask来mock接口
查看>>
vue
查看>>
MySQL存储过程和存储函数
查看>>
【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
查看>>
iis 隐藏 banner
查看>>
leetcode[18]4Sum
查看>>
Java ThreadLocal的使用
查看>>
为什么数据库ID不能作为URL中的标识符
查看>>
Mybatis 3.3.0 Log4j配置
查看>>
JavaScript打开窗口与关闭页面操作大全
查看>>
java 接口参数
查看>>
DP:Skiing(POJ 1088)
查看>>
kudu
查看>>
如何得到WAV文件播放的总时间
查看>>
移动端页面兼容性问题解决方案整理(三)
查看>>