• AtCoder Beginner Contest 044 C


    C - 高橋君とカード / Tak and Cards


    Time limit : 2sec / Memory limit : 256MB

    Score : 300 points

    Problem Statement

    Tak has N cards. On the i-th (1≤iN) card is written an integer xi. He is selecting one or more cards from these N cards, so that the average of the integers written on the selected cards is exactly A. In how many ways can he make his selection?

    Constraints

    • 1≤N≤50
    • 1≤A≤50
    • 1≤xi≤50
    • N, A, xi are integers.

    Partial Score

    • 200 points will be awarded for passing the test set satisfying 1≤N≤16.

    Input

    The input is given from Standard Input in the following format:

    N A
    x1 x2  xN
    

    Output

    Print the number of ways to select cards such that the average of the written integers is exactly A.


    Sample Input 1

    Copy
    4 8
    7 9 8 9
    

    Sample Output 1

    Copy
    5
    
    • The following are the 5 ways to select cards such that the average is 8:
      • Select the 3-rd card.
      • Select the 1-st and 2-nd cards.
      • Select the 1-st and 4-th cards.
      • Select the 1-st, 2-nd and 3-rd cards.
      • Select the 1-st, 3-rd and 4-th cards.

    Sample Input 2

    Copy
    3 8
    6 6 9
    

    Sample Output 2

    Copy
    0
    

    Sample Input 3

    Copy
    8 5
    3 6 2 8 7 6 5 9
    

    Sample Output 3

    Copy
    19
    

    Sample Input 4

    Copy
    33 3
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    

    Sample Output 4

    Copy
    8589934591
    
    • The answer may not fit into a 32-bit integer.

    题意:给定一串数字,问能够组成多少种不连续子串使得子串的平均数为某个数

    题解:用动态规划,i表示相加的个数,j表示加起来后的值

    #include<bits/stdc++.h>
    using namespace std;
    const int N=55;
    long long dp[N][N*N];      //dp值会爆int
    int main()
    {
        int n,a;
        cin>>n>>a;
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            for(int j=i-1;j>=0;j--)    //每一次个数向下减少
                for(int k=0;k<=N*j;k++)    //优化时间  由于k最大为N*j次
                    dp[j+1][k+x]+=dp[j][k];       //个数加1 则找到前面个数的值相加
        }
        long long ans=0;       
        for(int i=1;i<=n;i++)
                ans+=dp[i][i*a];    //累计所有个数会出现平均值满足a的情况
        cout<<ans<<endl;
        return 0;
    }
    漫天星辰,繁华时下。心中冷淡,一笑奈何。
  • 相关阅读:
    配置JAVA环境
    Sun Java认证
    JAVA中去掉空格
    2011年百度新闻热搜榜十大互联网人物
    23 设计模式
    HTML编辑器FCKeditor使用详解 [转]
    Linux 系统目录结构
    DotNet程序员是不是最不幸福?
    VS2005(c#)项目调试问题解决方案集锦 转
    详细介绍有关于.NET的委托
  • 原文地址:https://www.cnblogs.com/Scalpel-cold/p/7259118.html
Copyright © 2020-2023  润新知