openjudge divisibility

747:Divisibility

描述

Consider an arbitrary sequence of integers. One can place + or - operatorsbetween integers in the sequence, thus deriving different arithmeticalexpressions that evaluate to different values. Let us, for example, take thesequence: 17, 5, -21, 15. There are eight possible expressions: 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 
We call the sequence of integers divisible by K if + or - operators can beplaced between integers in the sequence in such way that resulting value isdivisible by K. In the above example, the sequence is divisible by 7(17+5+-21-15=-14) but is not divisible by 5. 

You are to write a program that will determine divisibility of sequence ofintegers. 

输入

The first line of the input file contains two integers, N and K (1 <= N<= 10000, 2 <= K <= 100) separated by a space. 
The second line contains a sequence of N integers separated by spaces. Eachinteger is not greater than 10000 by it's absolute value. 

输出

Write to the output file the word "Divisible" if given sequenceof integers is divisible by K or "Not divisible" if it's not.

样例输入

4 7

17 5 -21 15

样例输出

Divisible

来源

Northeastern Europe 1999

题目大意:在一串数中插于加号或减号,使最后的结果是k的倍数,如果可以输出Divisible,否则输出Not divisible

#include
#include
#include
using namespace std;
int n,m,i,j,k;
int num[100100],now[210],last[210];//last
数组存储的是上一个数计算完后的状态,然后在此基础上计算即可
int main()
{
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++)
  scanf("%d",&num[i]);
now[100]=1;
for (i=1;i<=n;i++)
  {
    num[i]%=k;
    for (j=100-k;j<=100+k;j++)
      {
          last[j]=now[j];
          now[j]=0;
      }
    for (j=100-k;j<=100+k;j++)//
动态规划部分
      if (last[j]==1)
       {
          now[(j-100-num[i])%k+100]=1;
          now[(j-100+num[i])%k+100]=1; 
       }
  }
if (now[100]==1)
 cout<<"Divisible";
else
  cout<<"Notdivisible";
return 0;
}

//标准的动态规划,因为考虑到有可能会出现负数,所以把余数统一加上100,保证它恒为正,但是注意转移时要减去100,用原来的数据进行计算得出答案

 

你可能感兴趣的:(动态规划)