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 }

 

posted @ 2021-08-03 17:35  Rekord  阅读(1499)  评论(0编辑  收藏  举报