zoukankan      html  css  js  c++  java
  • BZOJ 3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 动态规划

    3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

    题目连接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=3400

    Description

    农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘
    队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤100000).约翰要选出1只或多于1只奶牛来参加他的飞盘队.由于约翰的幸运数字是F(1≤F≤1000),他希望所有奶牛的飞盘水准指数之和是幸运数字的倍数.
    帮约翰算算一共有多少种组队方式.

    Input

    第1行输入N和F,之后N行输入Ri.

    Output

    组队方式数模10^8取余的结果.

    Sample Input

    4 5

    1

    2

    8

    2

    Sample Output

    3

    Hint

    题意

    有3000只羊,每只羊都有自己的能力值。

    问你有多少种选择方案,可以使得羊的能力值之和,是约翰能力值的倍数。

    题解:

    dp

    dp[i][j]表示前i只绵羊,当前mod约翰能力值倍数的为j的方案数。

    然后暴力转移

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int mod = 1e8;
    int dp[2][1005];
    int now=1,pre=0,n,f;
    int main()
    {
        scanf("%d%d",&n,&f);
        for(int i=1;i<=n;i++)
        {
            int x;scanf("%d",&x);
            swap(now,pre);
            memset(dp[now],0,sizeof(dp[now]));
            dp[now][x%f]++;
            for(int j=0;j<f;j++)
            {
                dp[now][j]=(dp[now][j]+dp[pre][j])%mod;
                dp[now][(j+x)%f]=(dp[now][(j+x)%f]+dp[pre][j])%mod;
            }
        }
        printf("%d
    ",dp[now][0]);
    }
  • 相关阅读:
    【数论】错排问题
    【数论】求逆元的几种方式
    【数论】卢卡斯定理模板 洛谷P3807
    【单调队列优化dp】 分组
    【期望dp】绵羊跳弹簧
    软件工程总结
    结对项目-地铁出行路线规划程序(续)
    个人作业--week3
    个人作业-week2
    个人作业-week1
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5794849.html
Copyright © 2011-2022 走看看