zoukankan      html  css  js  c++  java
  • hdu 5185(动态规划)

    Equation

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 500    Accepted Submission(s): 168


    Problem Description
    Gorwin is very interested in equations. Nowadays she gets an equation like this
    x1+x2+x3++xn=n, and here
    0xinfor1inxixi+1xi+1for1in1

    For a certain n, Gorwin wants to know how many combinations of xi satisfies above condition.
    For the answer may be very large, you are expected output the result after it modular m.
     
    Input
    Multi test cases. The first line of the file is an integer T indicates the number of test cases.
    In the next T lines, every line contain two integer n,m.

    [Technical Specification]
    1T<20
    1n50000
    1m1000000000
     
    Output
    For each case output should occupies one line, the output format is Case #id: ans, here id is the data number starting from 1, ans is the result you are expected to output.
    See the samples for more details.
     
    Sample Input
    2 3 100 5 100
     
    Sample Output
    Case #1: 2 Case #2: 3
     
    Source
     
     
    题意:求解满足条件的 x1+x2+ ... +xn = n 的种类数。
    题解:设计状态为 dp[i][j] 1- i 种数组成 j 的方案数。首先,我们可以确定 xi 的最大值为 1+2...+k = n 里面这个 k ,这样就可以将 dp[i][j]中的 i 确定成 k 了.然后 dp方程是 dp[i][j] = dp[i][j-i]+dp[i-1][j-i] 代表当选择第 i 种数的时候,前面要么选择 i 要么选择 i-1 。。然后最后再求一次和就可以了。
    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <queue>
    #include <algorithm>
    #include <math.h>
    using namespace std;
    int dp[320][50005];
    int main()
    {
        int tcase,t=1;
        scanf("%d",&tcase);
        while(tcase--){
            int n,m;
            scanf("%d%d",&n,&m);
            int k = 0;
            while(k*(k+1)<=2*n) k++;
            memset(dp,0,sizeof(dp));
            dp[0][0] = 1;
            for(int i=1;i<=k;i++){
                for(int j=i;j<=n;j++){
                    dp[i][j] = (dp[i][j-i]+dp[i-1][j-i])%m;
                }
            }
            int ans = 0;
            for(int i=1;i<=k;i++){
                ans = (ans+dp[i][n])%m;
            }
            printf("Case #%d: %d
    ",t++,ans);
        }
        return 0;
    }
  • 相关阅读:
    fiddler https
    Windows Media Player 网页播放器 参数含义
    ActionScript3.0程序开发工具
    同一目录两程序引用同一个类库dll,所引发的问题
    Flash在浏览器里调试获取trace
    linux下的i2c驱动框架
    IIC原理及简单流程
    Linux操作系统下 NAND FLASH驱动程序框架
    Linux操作系统简单NOR FLASH驱动开发
    网卡驱动
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5691186.html
Copyright © 2011-2022 走看看