我看的那背包专辑把这个放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;
}