1.自顶向下的动态编程
Example:计算组合数
组合定义:
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;
从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m) 表示.
推导:
从M个元素中任意指定一个元素。则选出N个的方法中,包含这一个元素的有C(M-1,N-1)种组合,不包含这一个元素的有C(M-1,N)种组合
递归公式:
![](https://img-blog.csdn.net/20130810160113656)
使用自顶向下的动态编程实现计算组合数
如果不使用动态编程,计算C(50,6)=15890700需执行3,813,767次函数递归调用,但使用动态编程只需执行441次函数调用
实现代码:
#include<iostream>
#include<vector>
using namespace std;
//res向量数组保存递归返回结果
//要求res至少有(n+1)(k+1)个元素,并初始化为-1
int comb(int n,int k,vector<vector<int>> &res)<
Example:计算组合数
组合定义:
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;
从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m) 表示.
推导:
从M个元素中任意指定一个元素。则选出N个的方法中,包含这一个元素的有C(M-1,N-1)种组合,不包含这一个元素的有C(M-1,N)种组合
递归公式:
使用自顶向下的动态编程实现计算组合数
如果不使用动态编程,计算C(50,6)=15890700需执行3,813,767次函数递归调用,但使用动态编程只需执行441次函数调用
实现代码:
#include<iostream>
#include<vector>
using namespace std;
//res向量数组保存递归返回结果
//要求res至少有(n+1)(k+1)个元素,并初始化为-1
int comb(int n,int k,vector<vector<int>> &res)<