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;
}
原文地址:https://www.cnblogs.com/dowson/p/3264415.html