求助搜索题
查看原帖
求助搜索题
246331
mystic_qwq楼主2024/1/17 09:44

求助才得12分,有没有书上来的,思路和书上一样

record

min(a,b){return a<b?a:b;}
cmp(int*a,int*b){return*a-*b;}
n,a[65],sum,len[51],nxt[51];
void dfs(k,t,g,i) { //k not done, this left t, smaller than g, s is the length of each
  if(t==0) {dfs(k-1,i,a[n],i);return;}
  if(k==0) exit(printf("%d",i)&0);
  g=min(t,g);
  while(g&&!len[g]) --g;
  while(g){
    if(len[g]) {
      --len[g],dfs(k,t-g,g,i),++len[g];
      if(g==t||t==i) break;
    }
    g=nxt[g];
  }
}
main(){
  scanf("%d",&n);
  for(int i=0;i<n;++i)scanf("%d",a+i),sum+=a[i],++len[a[i]];
  qsort(a,n,4,cmp);
  nxt[*a]=0;for(int i=n-1;i;--i){
    if(a[i]!=a[i-1])nxt[a[i]]=a[i-1];
  }
  for(int i=a[n-1];i<=sum/2;++i){
    if(sum%i==0) dfs(sum/i,i,a[n],i);//搜完一遍减一次,如果sum/i=1,则就是1遍,应当是这样
  }
  printf("%d",sum);
}

2024/1/17 09:44
加载中...