POJ:http://poj.org/problem?id=1745

A完这题去买福鼎肉片,和舍友去买滴~舍友感慨“这一天可以卖好几百份,每份就算赚一块钱。。那么一个月。。一年。。。”

我说“那我们以后去卖这个吧,饿了还能自己煮着吃”

哈哈,一群天真的少年呀~~~~

说正事~

------------------------------------------------华丽的分割线-------------------------------------------------

题目大意:

给一串数列,在其中间插入+或者-可以得到不同的结果,你需要判断的是对于n个这样的数经过一系列运算后最终是否能得到k。(每个数都要用,按题目给的顺序)

思路:

DP,本题的精华在于用位向量来表示是否出现过mod k的余数,最后判断0那个位置是否出现即可。

还可以直接用两个一维数组来优化空间复杂度,不过时间略长一些。(世界是公平的,有舍才有得)

1.未优化空间复杂度 141ms

#include<cstdio>
#include<cstring>
const int MAXN=10000+10;
bool dp[MAXN][110];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int temp;
scanf("%d",&temp);
memset(dp,0,sizeof(dp));
dp[0][( temp +k*10000) %k]=1; for(int i=1;i<n;i++)
{
scanf("%d",&temp);
for(int j=0;j<k;j++)
{
if(!dp[i-1][j])
continue; dp[ i ][ (j + temp +k*10000) %k ]=1;
dp[ i ][ (j - temp +k*10000) %k ]=1;
}
} if(dp[n-1][0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
}

2.优化了的版本 157MS

#include<cstdio>
#include<cstring>
bool dp[101];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int value;
scanf("%d",&value);
memset(dp,0,sizeof(dp));
dp[( value +k*10000) %k]=1; for(int i=1;i<n;i++)
{
bool temp[101]={0};
scanf("%d",&value);
for(int j=0;j<k;j++)
{
if(!dp[j])
continue; temp[ (j + value +k*10000) %k ]=1;
temp[ (j - value +k*10000) %k ]=1;
}
memcpy(dp,temp,sizeof(temp));
} if(dp[0])
printf("Divisible\n");
else
printf("Not divisible\n");
}
}

POJ 1745 Divisibility DP的更多相关文章

  1. POJ 1745 Divisibility (线性dp)

    Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10598   Accepted: 3787 Des ...

  2. POJ 1745 Divisibility【DP】

    题意:给出n,k,n个数,在这n个数之间任意放置+,-号,称得到的等式的值能够整除k则为可划分的,否则为不可划分的. 自己想的是枚举,将所有得到的等式的和算出来,再判断它是否能够整除k,可是有1000 ...

  3. POJ 1745 Divisibility

    Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9476   Accepted: 3300 Desc ...

  4. POJ 1745 【0/1 背包】

    题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  5. POJ 1745 线性和差取余判断

    POJ 1745 线性和差取余判断 题目大意:每个数都必须取到,相加或相减去,问所有的方案最后的得数中有没有一个方案可以整除k 这个题目的难点在于dp数组的安排上面 其实也就是手动模仿了一下 比如 一 ...

  6. [POJ 1745] Divisbility

    [题目链接] http://poj.org/problem?id=1745 [算法] DP [代码] #include <algorithm> #include <bitset> ...

  7. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  8. POJ 1745:Divisibility 枚举某一状态的DP

    Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11001   Accepted: 3933 Des ...

  9. poj上的dp专题

    更新中... http://poj.org/problem?id=1037 dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目; dp[i][j][1]表示序列长度为i, 以 ...

随机推荐

  1. vim--学习之emmet插件前端开发

    Emmet 在vim的使用: 1.嵌套 <ctr+y>+,(ctr+y+逗号三者的组合键,ctr+y一起按在按逗号)相当于Ememet中的Tab键. 2.内容的包围: 写好内容,退出编辑模 ...

  2. BZOJ4712: 洪水(树链剖分维护Dp)

    Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地 ...

  3. CMDB学习之五服务端api

    服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...

  4. VitrualBox虚拟机设置网络桥接方式与windows互相ping通

    一.VitrualBox 选择桥接模式 由于公司服务器对MASK地址访问外网有严格的限制,所以虚拟机里边的HWaddr mask地址没有加入公司的服务器的路由表里边,所以访问不了外网,而网络转换地址( ...

  5. 电商系统Broadleaf文档翻译(六) - 主要实体main entities

    主要实体 原文标题:main entities 原文出处:http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/d ...

  6. php数组时按值传递还是按地址传递

    php数组时按值传递还是按地址传递 一.总结 1.数组都是按值:php普通变量和数组的赋值(=)是按值传递,对象的赋值(=)是按址传递 2.对象和按值和按址:对象的clone(用clone关键字)是按 ...

  7. 后台vb校验是否GUID

    '校验是否GUID Private Function IsGUID(ByVal strGUID As String) As Boolean Dim regexTemp As System.Text.R ...

  8. 关于使用toFixed()函数时报错"toFixed() is not a function"的问题

    toFixed()函数只有数字类型的参数才可使用,字符串类型的参数需用parseFloat或者parseInt转换后再使用

  9. CListCtrl 隔行变色

    响应消息 ON_NOTIFY(NM_CUSTOMDRAW, ListCtrl的ID, OnNMCustomdrawList) 实现函数OnNMCustomdrawList void CFinishWe ...

  10. Dialog和FormView如何派生通用类

    派生通用类涉及到派生类的构造函数需要传递窗口ID和CWnd,所以要在派生类中事先定义好 在Dialog中构造函数是这样定义的 public: CDialogEx(); CDialogEx(UINT n ...