http://acm.hdu.edu.cn/showproblem.php?pid=1028
整数的拆分 求能组成n的种类
方法一:
完全背包
#include<stdio.h>
#include<string.h>
int dp[200];
int main()
{
int i,j;
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
dp[j]+=dp[j-i];
printf("%d\n",dp[n]);
}
return 0;
}
方法二:
母函数(生成函数)
# include <stdio.h>
# include <stdlib.h>
int main ()
{
int num1[121];
int num2[121];
int n;
while ( scanf ("%d", &n) != EOF )
{
for ( int i = 0; i <= n; i ++ ) //不要初始化错了
{
num2[i] = 0;
num1[i] = 1; //第一个表达式中的面值组合都是1,所以下面的是从第二个表达式开始
}
for ( int i = 2; i <= n; i ++ )
{
for( int j = 0; j <= n; j ++ ) //注意每一个表达式都是从第 0 项开始 到 第 n 项
{
for (int k = 0; k + j <= n; k += i)
{
num2[k + j] += num1[j];
}
}
for (int i = 0; i <= n; i ++)
{
num1[i] = num2[i]; //num2[] 只是起到一个中间保留面值的作用组合的作用,而从下一个表达式开始又要初始化为0
num2[i] = 0;
}
}
printf ("%d\n", num1[n]);
}
// system ("pause");
return 0;
}