1195:判断整除
将前n-1个数看成一个整体序列,则n个数可能产生的结果就等于“前n-1个数产生的所有结果分别加上第n个数或分别减去第n个数”
n-2也同理……直到1为止。
由于是判断有无结果能被k整除,所以所有的中间结果都可以取余k,从而使所有可能的结果保持在一个不大的范围,用数组进行存储。
下面代码中的ans[i][j]表示i个数的序列有没有取余k后为j的结果,0表示没有,1表示有。
1 #include<iostream> 2 using namespace std; 3 4 const int N=105; 5 int a[N*N],ans[N*N][N]; 6 7 int main(){ 8 int n,k; 9 //接收输入 10 cin>>n>>k; 11 for(int i=1;i<=n;i++){ 12 cin>>a[i]; 13 a[i]%=k; 14 } 15 ans[0][0]=1; 16 //核心算法 17 for(int i=1;i<=n;i++){ 18 for(int j=0;j<k;j++){ 19 if(ans[i-1][j]){ 20 ans[i][(j+a[i])%k]=ans[i][(j-a[i]+k)%k]=1; 21 } 22 } 23 } 24 if(ans[n][0])cout<<"YES"; 25 else cout<<"NO"; 26 return 0; 27 }