upcoj 2169 DP

来源:互联网 发布:2017最火的编程语言 编辑:程序博客网 时间:2024/06/15 11:55

题意:求给出的数组中元素求和能被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;}