| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 11044 | Accepted: 3949 |
Description
Input
Output
Sample Input
4 7 17 5 -21 15
Sample Output
Divisible
题意:给你N个数和一个数K,问你能不能 按顺序在两个数间添加一个运算符使得N个数的结果mod K = 0。(运算符只能是加减)
思路:设dp[i][j]表示前i个数经过加减后 结果mod K = j是成立的,那么我们只要推出dp[N][0]是否为1就ok了。
状态转移方程
当dp[i-1][j]非0时
1,dp[i][t] = 1其中t = ((j + a[i]) % K + K) % K. 说明一下——(j + a[i])%K后 加个K最后再取余 是为了避免值是负数。
2,dp[i][t] = 1其中t = ((j - a[i]) % K + K) % K.
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 10000+10
using namespace std;
int dp[MAXN][110];//表示前i个数经过加减运算后 结果mod K = j 是成立的
int a[MAXN];
int main()
{
int N, K;
while(scanf("%d%d", &N, &K) != EOF)
{
for(int i = 1; i <= N; i++)
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));//初始化
dp[0][0] = 1;//初值
for(int i = 1; i <= N; i++)
{
for(int j = 0; j < K; j++)
{
if(dp[i-1][j])
{
//注意j+a[i] 或者 j-a[i]可能是负数 需要加K处理
int t = ((j + a[i]) % K + K) % K;
dp[i][t] = 1;
t = ((j - a[i]) % K + K) % K;
dp[i][t] = 1;
}
}
}
if(dp[N][0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/chenzhenyu123456/article/details/47785195