hdoj 5185 Equation (线性dp 完全背包)

来源:互联网 发布:下载播音录音软件 编辑:程序博客网 时间:2024/06/05 00:33
题目大意:问按照题目所给的公式,有多少种不同的方法得到n,方法数对m取余
有条件x[i+1]-x[i]>=1;
 mx * (mx + 1) / 2 == n
化简可以得到mx = (sqrt(8n + 1) - 1) / 2
递推方程是dp[i][j]=dp[i][j-i]+dp[i-1][j-i];
前i个数字合成j的种类数等于合成j-i时放了i和没放i两种情况的和,dp[0][0] = 1;
#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;int dp[333][50001];int main(){    int T,k=1;    scanf("%d",&T);    while(T--)    {        int n,m;        scanf("%d%d",&n,&m);        int mx=(int)((sqrt(8*n+1)-1)/2);        dp[0][0]=1;        for(int j=1;j<=n;j++)        {            for(int i=1;i<=min(j,mx);i++)                dp[i][j]=(dp[i-1][j-i]+dp[i][j-i])%m;        }        int ans=0;        printf("Case #%d: ",k++);        for(int i=1;i<=mx;i++)            ans=(ans+dp[i][n])%m;        printf("%d\n",ans);    }    return 0;}


                                             
0 0
原创粉丝点击