poj 1745 Divisibility dp

来源:互联网 发布:网络虚拟手机号发短信 编辑:程序博客网 时间:2024/05/18 20:11

题意:

给你n个数每个数可以取正负,问是否存在一种情况使得最后的公式%k的值等于0

分析:

因为k<=100,所以我们可以记dp【i】【j】为到第i位数时候公式对j取mod是否为0(1表示是,0表示不是不能整除)

那么dp【i】【j】=max(dp[i-1][(j-a[i]+m)%m],dp[i-1][(j+a[i])%m]);

ACcode:

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#define maxn 10007#define inf 0x3f3f3f3f3f#include <cstring>using namespace std;int a[maxn];int dp[maxn][105];int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF){        for(int i=1;i<=n;++i){            scanf("%d",&a[i]);            a[i]%=m;            if(a[i]<0)a[i]+=m;        }        memset(dp,0,sizeof(dp));        dp[1][a[1]]=1;        for(int i=2;i<=n;++i)            for(int j=0;j<m;++j)                dp[i][j]=max(dp[i-1][(j-a[i]+m)%m],dp[i-1][(j+a[i])%m]);        printf("%s\n",dp[n][0]?"Divisible":"Not divisible");    }    return 0;}


0 0
原创粉丝点击