您的位置:首页 > 其它

【DP】NYOJ 176 整数划分(二)

2016-10-28 14:23 302 查看
整数划分(二)(DP)

解决问题:

把一个正整数m分成n个正整数的和,有多少种分法?

解决方法:

dp[i][j]代表: m为i,并分成j个正整数的和时的分法。

初始化: dp[i][1] = 1。

递推式:

dp[i][j] = dp[i-1][j-1] (有1的情况) + dp[i-j][j] (没有1的情况)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int N = 105;
typedef long long LL;
const int INF=0x3f3f3f3f;

int n,m;
int dp

; //dp[i][j]代表数字为i,分成j个正整数时的方法数
void slove()
{
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++)
dp[i][1] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 2; j <= i; j++)
dp[i][j] = dp[i-1][j-1]+dp[i-j][j];
}
printf("%d\n",dp
[m]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
slove();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: