poj 1745
典型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;
}
浙公网安备 33010602011771号