zoukankan      html  css  js  c++  java
  • upcoj 2169 DP

    题意:求给出的数组中元素求和能被m整除的最大元素个数.

    一开始想BFS搜索,数据太大,无果。太急去敲了,应该早就料到数据太大,但是有一个思路之后却总想去试试。。

    好了,DP

    状态转移方程dp【i】【(v+a【i】)%m】=max(dp【i】【(v+a【i】)%m】,dp【i-1】【v】+1)    //  dp[i][v]代表对于第i个状态数字处理时,能组成%m=v的数字的个数

    但是由于规模将近5qw  直接存数组不行,用另外一个数组来记录前一个数组的状态。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    int a[550];
    int dp[100100];
    int fdp[100100];
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int n,m;
            cin>>n>>m;int sum=0;
            for(int i=0;i<n;i++)
            {
                cin>>a[i];
                sum+=a[i];
            }
            memset(dp,0,sizeof(dp));
            memset(fdp,0,sizeof(fdp));
            fdp[0]=1;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                dp[j]=fdp[j];
                for(int j=0;j<m;j++)
                {
    
                    if(fdp[j]>0)   //有j余出
                        {
                            dp[(j+a[i])%m]=max(dp[(j+a[i])%m],fdp[j]+1);
                        }
                }
                for(int j=0;j<m;j++)
                fdp[j]=dp[j];
    
            }
            cout<<fdp[0]-1<<endl;
        }
        return 0;
    }
    

  • 相关阅读:
    线程中测试getName方法和getId方法
    编写一个线程改变窗体的颜色
    创建两个线程分别输出1-100
    输出一个目录中的内容
    file占用字节
    MAP集合选出最大值
    使用增强for循环遍历集合
    数据框中的基本操作
    列表的基本操作
    因子的基本操作
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134155.html
Copyright © 2011-2022 走看看