这道题就是整数的划分,其实定义好了状态,就是简单的动态规划的递推。
我们定义dp[n][k]表示将n进行划分,最大的数不超过k的方案有多少种,那么我们可以得到如下的递推方案:
dp[n][k] = dp[n][k-1] + dp[n-k][k];
其中的dp[n][k-1]便是将n进行进行整数的划分,最大的数不超过k-1的方案数;dp[n-k][k]表示拿出一个k后,剩下的数被不超过k的数的表示的方案数。
其中当k>n的时候,则和dp[n][n]的值相同,下面通过递推的方式求出所有的解,然后对应的输入n,输出dp[n][n]就行了。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int MAX = 122;
int dp[MAX][MAX];
void Dynamic()
{
for(int i=1; i<MAX; i++)
{
dp[i][1] = dp[1][i] = dp[0][i] = 1;
}
for(int i=2; i<MAX; i++)
{
for(int j=2; j<MAX; j++)
{
if(j<=i)
dp[i][j] = dp[i][j-1] + dp[i-j][j];
else
dp[i][j] = dp[i][i];
}
}
}
int main()
{
int n;
Dynamic();
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[n][n]);
}
return 0;
}
本文介绍了一种利用动态规划解决整数划分问题的方法。定义dp[n][k]为将n划分为若干个不大于k的正整数之和的方案数,并给出递推公式dp[n][k]=dp[n][k-1]+dp[n-k][k]。通过递推计算所有可能的解,并输出dp[n][n]作为最终答案。
&spm=1001.2101.3001.5002&articleId=8118683&d=1&t=3&u=c8487aa0f17c44e19bd26e6d0a8afeda)
497

被折叠的 条评论
为什么被折叠?



