poj1745 递推
来源:互联网 发布:用来码字的软件 编辑:程序博客网 时间:2024/06/05 18:42
题目链接:点击打开链接
题意:
给 n 个数,判断这些数在任意加减的组合下能否被 k 整除;
理解:
看题懵逼;
坐了俩小时,只有看题解;
还好题解能看懂;
说的是这样的;
首先这些数要通过加减组合起来;
那么他们的余数只要等于了 k,就说明能被整除;
于是给定递推式:前 i 个数的和的余数是否为 j;
即:dp[i - 1][j] == 1的情况下,有:dp[i][(j + v[i]) % k] = 1, dp[i][((j - v[i]) % k + k) % k] = 1;
还有更厉害的递推式:dp[i][j] = dp[i - 1][(j + v[i]) % k] || dp[i - 1][((j - v[i]) % k + k) % k];
初始值为:dp[0][v[0]] = 1;
即:前 1 数的和的余数为 v[0] 的值为 1;
代码如下:
#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#include <stack>using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MIN_INF = 1e-7;const int MAX_INF = (1e9) + 7;#define X first#define Y secondint aabs(int a) { return a < 0 ? -a : a;}int dp[10010][110];int main() { int n = 1, k; while (cin >> n >> k) { vector<int> v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; v[i] = aabs(v[i]) % k; } dp[0][v[0]] = 1; for (int i = 1; i < n; ++i) { for (int j = k - 1; j >= 0; --j) { if (dp[i - 1][j]) { dp[i][(j + v[i]) % k] = 1; dp[i][((j - v[i]) % k + k) % k] = 1; } } } if (dp[n - 1][0] == 1) { cout << "Divisible" << endl; } else { cout << "Not divisible" << endl; } } return 0;}
0 0
- poj1745 递推
- poj1745
- POJ1745
- poj1745 Divisibility
- poj1745 Divisibility
- poj1745 - Divisibility
- poj1745 Divisibility
- poj1745 dp
- poj1745 Divisibility
- [DP]poj1745
- 【poj1745】Divisibility
- Poj1745 Divisibility
- <poj1745>Divisibility
- **【poj1745】Divisibility
- 【POJ1745】Divisibility
- 【poj1745】 Divisibility
- POJ1745 Divisibility (DP)
- POJ1745解题报告
- arcgis JavaScript api 的打印功能
- 单元测试(一)
- HTTP、TCP/IP协议与Socket之间的区别
- Ubuntu14.04安装Linux源码
- 《杂文》 -- 说做就做,现在开始
- poj1745 递推
- Xinyu Zhang - Department of Electrical and Computer Engineering University of Wisconsin-Madison
- THUCLC笔记
- android 各种设置1
- 配置表的判定写法.
- 返回JSON数据,懒加载异常的处理
- java中关于拓展赋值运算符的注意事项!!
- 生产者消费者模型
- c++虚函数表解析