hdu 1028 Ignatius and the Princess III(母函数,完全背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1028

整数划分问题。

第一道母函数。。。母函数入门

小于等于n的整数共有n个,1,2......n,每个数都有无限多个,对于整数1,它所对应的母函数为(1+x+x^2+...+x^k+...),整数2对应的母函数为(1+x^2+X^4+...+x^(2*k)+...),整数3对应的母函数为(1+x^3+x^6+...+x^(3*k)+...),以此类推,直到整数n。

那么n的整数划分的个数就是这n个母函数乘积(1+x+x^2+...+x^k+...)*(1+x^2+x^4+...+x^(2k)+...)*(1+x^3+x^6+...+x*(3k)+...)+...+(x+x^n+x^(2n)+...)后x^n对应的系数。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;

int c1[130],c2[130];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
    	//初始化,对应第一个表达式(1+x+x^2+...+x^k+...),这时每个i在[0,n]之间都只有一种划分。
        for(int i = 0; i <= n; i++)
        {
            c1[i] = 1;
            c2[i] = 0;
        }
		//从第二个表达式开始
        for(int i = 2; i <= n; i++)
        {
            for(int j = 0; j <= n; j++) //j从0到n枚举
            {
                for(int k = 0; k + j <= n; k += i) //k枚举第i个表达式的指数,第i个表达式的增量为i。
                {
                    c2[k+j] += c1[j];
                }
            }
            for(int j = 0; j <= n; j++) //把c2[]的值赋给c1[],因为c2[]每次是从一个表达式开始的。
            {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
        printf("%d\n",c1[n]);//x^n的系数就是n的整数划分数。
    }
    return 0;
}

完全背包也可以解。只是把状态转移方程f[i][v] = max( f[i-1][v],f[i-1][v-c[i]]+w[i])的max改成sum。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;

int dp[130];

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		memset(dp,0,sizeof(dp));
		dp[0] = 1;

		for(int i = 1; i <= n; i++)
		{
			for(int j = i; j <= n; j++)
				dp[j] += dp[j-i];
		}

		printf("%d\n",dp[n]);
	}
	return 0;
}

hdu 1028 Ignatius and the Princess III(母函数,完全背包),布布扣,bubuko.com

时间: 2024-11-03 05:28:10

hdu 1028 Ignatius and the Princess III(母函数,完全背包)的相关文章

HDU 1028 Ignatius and the Princess III(母函数)

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15794    Accepted Submission(s): 11138 Description "Well, it seems the first problem is too easy. I will let you kno

hdu 1028 Ignatius and the Princess III 简单dp

题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是dp[i][i].那么dp[i][j]=dp[i][j-1]+dp[i-j][i-j],dp[i][j-1]是累加1到j-1的结果,dp[i-j][i-j]表示的就是最大为j,然后i-j有多少种表达方式啦.因为i-j可能大于j,这与我们定义的j为最大值矛盾,所以要去掉大于j的那些值 /*******

hdu 1028 Ignatius and the Princess III(整数划分)

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12731    Accepted Submission(s): 8999 Problem Description "Well, it seems the first problem is too easy. I will let

(简单母函数模板)hdu 1028 Ignatius and the Princess III

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14405    Accepted Submission(s): 10142 Problem Description "Well, it seems the first problem is too easy. I will le

hdu 1028 Ignatius and the Princess III 【整数划分】

Ignatius and the Princess III                                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15730    Accepted Submission(

HDU 1028 Ignatius and the Princess III dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 一道经典题,也是算法设计与分析上的一道题,可以用递推,动态规划,母函数求解,我用的是动态规划,也就是递推的变形. dp[i][j]表示数i的划分中最大数不超过j的划分的个数 状态转移方程: if(j > i) dp[i][j] = dp[i][i]; if(j == i) dp[i][j] = dp[i][j - 1] + 1; if(j < i) dp[i][j] = dp[i][j -

HDU 1028.Ignatius and the Princess III【分析】【8月20】

Ignatius and the Princess III Problem Description "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says. "The second problem is, given an positive integer N, we define an equation like

HDU 1028 Ignatius and the Princess III (动态规划)

题目链接:HDU 1028 Problem Description "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says. "The second problem is, given an positive integer N, we define an equation like this: N=a[1]+a[2

HDU 1028 Ignatius and the Princess III伊格和公主III(AC代码)母函数

本题听说可用递推.DP等方法来做,但是此题是母函数的入门经典喔~所以我用了母函数 1 #include <iostream> 2 #define N 120 3 using namespace std; 4 int ans[N+1],sup[N+1];//ans保存答案,sup保存临时值 5 void main() 6 { 7 int num=0,i,j,k; 8 for(i=0;i<N+1;i++) //全部初始化为1 9 ans[i]=1; 10 for(i=2;i<=N;i+