poj 1745 Divisibility

来源:互联网 发布:淘宝拍摄平台 编辑:程序博客网 时间:2024/05/19 03:26

此题看听说是dp,然后自己也就只按照dp去想,代码跑了近600ms,算是险过吧。

dp的思路,用余数来作为dp的判断条件,因为余数有正有负,所以需要把所有都正值化,即将200作为分界点,然后就是最普通的dp了,其实想到用余数来dp就已经接近解决了。

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N = 10001;int n,k;int arr[N];bool dp[2][401];int main(void){    cin>>n>>k;    bool flag = false;    for(int i=1;i<=n;++i)    scanf("%d",arr+i);    memset(dp[0],false,sizeof(dp[0]));    dp[0][200] = true;    int mi = 200 - k + 1;    int ma = 200 + k -1;    for(int i=1;i<=n;++i)    {        int now = i&1;        int fro = (i-1)&1;       memset(dp[now],false,sizeof(dp[now]));       for(int j=mi;j<=ma;++j)       if(dp[fro][j])       {           int tmp = (j-200+arr[i])%k+200;           int tmp1 = (j-200-arr[i])%k+200;           dp[now][tmp] = true;           dp[now][tmp1] = true;       }    }    if(dp[n%2][200])       cout<<"Divisible"<<endl;    else        cout<<"Not divisible"<<endl;    return 0;}


原创粉丝点击