poj 1745

 

 题目描述:给你n个整数,和一个k值(2<=k<=100),问在这n个数之间的n-1的位置任意放加减号,问有没有一种情况使结果整除k。

典型dp。

    dp[i][j]=dp[i-1][j-a[i]]||dp[i-1][j+a[i]];

当然要考虑余数为负数的情况。

代码:

#include<iostream>
#include<fstream>
using namespace std;
int a[10001];
int dp[10001][101];
int n,m;
void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>a[i];
    s=a[1];
    while(s<0) s+=m;
    dp[1][s%m]=1;

    for(i=2;i<=n;i++)
    {
        for(j=0;j<m;j++)
        {   
            s=j-a[i];
            while(s<0) s+=m;
            t=j+a[i];
            while(t<0) t+=m;
            dp[i][j]=dp[i-1][s%m]||dp[i-1][t%m];
        }
    }
    if(dp[n][0])
        cout<<"Divisible"<<endl;
    else
        cout<<"Not divisible"<<endl;
}

int main(){
    read();
    return 0;
}  

posted on 2011-02-24 11:20  宇宙吾心  阅读(687)  评论(0)    收藏  举报

导航