01背包__DP(POJ1745)

   题意:n个整数中间填上+或者-,运算结果能否被k整除。1<=n<=10000, 2<=k<=100

 代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10005
bool dp[N][100];
int a[N];
int main()
{
    int n,k,i,j;
    memset(dp,false,sizeof(dp));
    dp[0][0]=true;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n;i++)
    {
        for(j=0;j<k;j++)
        {
            if(dp[i-1][j])
            {
                dp[i][(j+a[i]%k+k)%k]=true;
                dp[i][(j-a[i]%k+k)%k]=true;
            }
        }
    }
    if(dp[n][0])
        printf("Divisible\n");
    else
        printf("Not divisible\n");
    return 0;
}





posted @ 2015-07-24 21:01  Zeroinger  阅读(99)  评论(0编辑  收藏  举报
无觅关联推荐,快速提升流量