1745Divisibility
这道题目,整个过程都是自己做的,其中j的取值比较讲究技巧,%k——————————————通过了
#include "iostream" #include "string.h" #include "algorithm" using namespace std; int f[11000][110]; int n,k,i,list[10100],s,e,j,flag; bool cmp(int a,int b){ return a>b; } int main(){ cin>>n>>k; for(i=1;i<=n;i++){ cin>>list[i]; list[i]=list[i]>0?list[i]:(-list[i]); list[i]=list[i]%k; } //for(j=1;j<=n;j++)cout<<list[j]<<' ';cout<<endl; sort(list+1,list+n+1,cmp); //for(j=1;j<=n;j++)cout<<list[j]<<' ';cout<<endl; memset(f,0,sizeof(f)); f[1][list[1]]=1; //for(j=0;j<k;j++)cout<<f[1][j]<<' ';cout<<endl; for(i=2;i<=n;i++){ if(!list[i])break; for(j=0;j<=k-1;j++){ if(f[i-1][j]!=0){ f[i][(j+list[i]+k)%k]=1; f[i][(j-list[i]+k)%k]=1; } } //for(j=0;j<k;j++)cout<<f[i][j]<<' ';cout<<endl; } if(f[i-1][0])cout<<"Divisible"<<endl; else cout<<"Not divisible"<<endl; }
另外我也用了一种超时的方法,就是深搜,这样做,即使我想尽方法,它也是超时,后来觉得确实是这样,所以就转用dp来解决这个问题,下面是我的深搜算法,代码更加简短明了,就是超时了
#include "iostream" #include "algorithm" using namespace std; int n,k,i,num[10100],sum; bool cmp(int a,int b){ return a>b; } int dfs(int sum,int step){ if(step==n){ if(sum%k==0)return 1; else return 0; } if(num[step+1]==0){ if(sum%k==0)return 1; else return 0; } if(dfs(sum+num[step+1],step+1))return 1; if(dfs(sum-num[step+1],step+1))return 1; } int main(){ cin>>n>>k; for(i=1;i<=n;i++){cin>>num[i];num[i]=num[i]%k;} sort(num+1,num+n+1,cmp); sum=num[1]; if(dfs(sum,1))cout<<"Divisible"<<endl; else cout<<"Not divisible"<<endl; }