标签:
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