poj 1745 Divisibility(01背包)

来源:互联网 发布:世界地图制作软件 编辑:程序博客网 时间:2024/06/01 20:54

我看的那背包专辑把这个放01背包里了,感觉并不像啊。
(a+b)%mod=(a%mod+b%mod)%mod
dp[i][j]==true表示表示前i个数字经过加加减减的操作后,%K=j,dp[i][j]==false,那就是%K!=j。然后对下一个数字num计算(j+num)%K和(j-num)%K,然后标记,最后如果dp[N][0]==true,则说明前边那些数字经过++–的操作后能被K整除。

#include <stdio.h>#include <string.h>int num[10010];bool dp[10010][110];int N,K;int mod(int n){    return (n%K+K)%K;}int main(){    scanf("%d %d",&N,&K);    for(int i = 0; i < N; ++i)        scanf("%d",&num[i]);    dp[1][mod(num[0])] = true;    for(int i = 1; i < N; ++i)    {        for(int j = 0; j < K; ++j)        {            if(dp[i][j])            {                dp[i+1][mod(j+num[i])] = true;                dp[i+1][mod(j-num[i])] = true;            }        }    }    if(dp[N][0])        printf("Divisible\n");    else        printf("Not divisible\n");    return 0;}