UVA 10036 Divisibility
2016-05-18 22:48
239 查看
题意:给你N个数,在N个数中加入加号或减号,判断能否组成整除K的组合。
解:刚开始想到了暴搜,但是一看数据太大,只有想其他办法。原来是dp,我们可以这样理解,dp[i][j]表示被第i个数除时,余数为j.让后它为真时,dp[i+1][(j+a[i]+k)%k]=1;
dp[i+1][(j-a[i]+k)%k]=1;
这两个也是真。最后,判断一下dp
[0]是否为真就可以了
解:刚开始想到了暴搜,但是一看数据太大,只有想其他办法。原来是dp,我们可以这样理解,dp[i][j]表示被第i个数除时,余数为j.让后它为真时,dp[i+1][(j+a[i]+k)%k]=1;
dp[i+1][(j-a[i]+k)%k]=1;
这两个也是真。最后,判断一下dp
[0]是否为真就可以了
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<string> #include<map> #include<queue> #include<algorithm> using namespace std; const int inf=1<<29; const int maxm=1e4+10; int a[maxm]; int dp[maxm][maxm]; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int n,k; scanf("%d%d",&n,&k); for(int i=0;i<n;i++) { scanf("%d",&a[i]); a[i]=abs(a[i])%k; } //dp[i][j]表示被第i个数除时,余数为j dp[0][0]=1; for(int i=0;i<n;i++) { for(int j=0;j<k;j++) { if(dp[i][j]) { dp[i+1][(j+a[i]+k)%k]=1; dp[i+1][(j-a[i]+k)%k]=1; } } } if(dp [0]) printf("Divisible\n"); else printf("Not divisible\n"); } return 0; }
相关文章推荐
- ListView
- static 静态成员
- JVM学习
- Android 四种常用的监听器
- 基于AT91SAM9261EK的嵌入式Linux2.6.32+Yaffs2 根文件系统移植成功
- Java实现导出Excel文件
- CQL操作
- 最小费用最大流模板
- android native 与h5 交互技巧
- SQL SERVER 局部变量
- 第十三周
- JAVA设计模式(11):结构型-装饰模式(Decorator)
- Python处理多个客户端连接---派生服务器
- Collections中sort()和Arrays中的sort方法分析
- 14-利用SVD简化数据
- pycharm 注册
- LeetCode 101. Symmetric Tree
- Leetcode Everyday: 340. Longest Substring with At Most K Distinct Characters
- Java文件读写操作
- 二分排序法