dp——「一本通 1.3 例 1」数的划分

dp——「一本通 1.3 例 1」数的划分

一、题目描述

题目链接

二、解题思路

题目说这是一道搜索的题,可能最近写动态规划写多了,但我惊奇的发现,这也是一道多阶段决策最优化问题,于是,就开始写动态规划的代码。

【数学建模】

令dpi,j代表用j个数字的和为i的种数。

dp数组 1 2 3
1 1 0 0
2 1 1 0
3 1 1 1
4 1 2 1
5 1 2 2
6 1 3 3
7 1 3 4

ans=dpn,m=dp7,3=4

【状态转移方程】

1、从表格中推出状态转移方程

dpi,j=dpi-1,j-1+dpi-j,j

2、原因

可以看出:组成i的方法是:先用j-1个数来组成i-1,再加上用j个数来组成i-j,所以数量已是如此。

【边界(初始化)】

因为用一个数组成i只有一个方法,所以dpi,1=1。

注意

如果n

三、代码

因为for循环自底而上比较难难想,而且数据量也不大,就采用了递归(自上而下)的方法。

#include
#include
using namespace std;
int n,m;
int dp(int nn,int kk)
{
	if(kk==1)
		return 1;
	if(nn<kk)
		return 0;
	return dp(nn-1,kk-1)+dp(nn-kk,kk);
}
void init()//输入 
{
	scanf("%d%d",&n,&m);
} 
void solve()
{
	printf("%d",dp(n,m));
}
int main()
{
	init();
	solve();
	return 0;
} 

你可能感兴趣的:(动态规划,动态规划,c++)