dp百题进度条[2/100]

题目链接

题目描述

对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值。比如,现在有一个整数数列:17,5,-21,-15,那么就可以构造出8个表达式:

17+5+(-21)+15=16
17+5+(-21)-15=-14
17+5-(-21)+15=58
17+5-(-21)-15=28
17-5+(-21)+15=6
17-5+(-21)-15=-24
17-5-(-21)+15=48
17-5-(-21)-15=18

对于一个整数数列来说,我们能通过如上的方法构造出不同的表达式,从而得到不同的数值,如果该数值能够被k整除的话,那么我们就称该数列能被k整除。 在上面的例子中,该数列能被7整除(17+5+(-21)-15=--14),但不能被5整除。现在你的任务是,判断某个数列是否能被某数整除。

输入格式

第一行是一个整数m,表示有m个子任务。接下来就是m个子任务的描述。 每个子任务有两行。第一行是两个整数n和k(1<=n<=10000, 2<=k<=100),n和k中间有一个空格。n 表示数列中整数的个数;k就是需要你判断的这个数列是否能被k 整除。第二行是数列的n个整数,整数间用空格隔开,每个数的绝对值都不超过10000。

输出格式

输出文件应有m 行,依次对应输入文件中的m 个子任务,若数列能被k 整除则输出 "Divisible",否则输出 "Not divisible" ,行首行末应没有空格。

输入输出样例

输入 #1

2

4 7

17 5 -21 15

4 5

17 5 -21 15

输出 #1

Divisible

Not divisible

思路一:正常的dp

0/1背包,自己看就好惹

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 10005; int x,k,n;
bool dp[MAXN][1005];
inline int mod(int x){
x %= k;
if (x < 0) x += k;
return x;
}
int main(){
int t;
scanf("%d",&t); while (t--){
scanf("%d %d",&n,&k); memset(dp,false,sizeof(dp)); scanf("%d",&x); dp[0][mod(x)] = true;
dp[0][mod(-x)] = true; for (register int i = 1 ; i < n ; i++){
scanf("%d",&x);
x = mod(x);
for (register int j = 0 ; j < k ; j++){
dp[i][j] = dp[i - 1][mod(j - x)] | dp[i - 1][mod(j + x)];
}
} if (t == 0){
if (dp[n - 1][0] == true) printf("Divisible");
else printf("Not divisible");
} else{
if (dp[n - 1][0] == true) printf("Divisible\n");
else printf("Not divisible\n");
}
} return 0;
}

思路二(我很钦佩的一种做法):

随机化算法,完全看脸

Code(别人的):

#include<cstdio>
#include<cstdlib>
using namespace std; int a[10001];
int i,n,T,k,randomm,ans; int main( )
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
int tot=500,flag=0;
while(tot)
{
tot--;
ans=0;
for(i=1;i<=n;i++)
{
randomm=rand();
if(randomm%2)
ans+=a[i];
else
ans-=a[i];
}
if(ans%k==0)
{
printf("Divisible\n");
flag=1;
break;
}
}
if(!flag) printf("Not divisible\n");
}
return 0;
}

最新文章

  1. 退出多个activity的方法
  2. 【HDU 5835】Danganronpa(分配礼物)
  3. (BFS)poj1465-Multiple
  4. memcached在windows下的安装与命令使用方法
  5. 通用对象转换Json格式
  6. bzoj1751 [Usaco2005 qua]Lake Counting
  7. bzoj1622 [Usaco2008 Open]Word Power 名字的能量
  8. 笔记本开通手机WiFI热点
  9. LCA 倍增
  10. java使用spark/spark-sql处理schema数据(spark1.6)
  11. JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable
  12. PostgreSQL:Java使用CopyManager实现客户端文件COPY导入
  13. hibernate框架学习之增删改查helloworld
  14. cocos2d-x入门学习--准备篇
  15. ajax传输中文参数乱码,本地使用tomcat不乱码,liunx+weblogic乱码
  16. mv 命令
  17. mysql下有符号数和无符号数的相关问题
  18. Informatica 常用组件Lookup之一 概述
  19. windows更新文件和windows.old文件夹清理
  20. 为什么document.write()会清空原来的内容

热门文章

  1. 《一张图看懂华为云BigData Pro鲲鹏大数据解决方案》
  2. luogu P5596 【XR-4】题
  3. IOS UIAlertView(警告框)方法总结
  4. Ceph 介绍及原理架构
  5. 怎么定义一个自己的vue组件
  6. 【python3】Python十行代码搞定文字转语音
  7. html小工具——文章注释编辑器
  8. 【重温基础】JS中的常用高阶函数介绍
  9. 海思HI3518EV200+AR0130开发板DIY——前篇
  10. eclipse右下角一直在loading jar文件,如何关闭?