カメヲラボ

主にプログラミングとお勉強全般について書いてます

Dividing(1)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1014
随分昔にやった問題ということと、他に誰もやっていなくて全く競争してないという理由で、相当短縮できるのではないかと判断しました。一応手元にあるコードを晒しておきますが、自分で考えて書いたほうが良さげなかんじです^^;

i,t,k,d[];
f(n,x,b){
  b=fmin(d[--x],n/x);
  for(k=n+b*~x?k:1;x*~b;)f(n+b--*~x,x);
}
main(s){
  for(k=i=s=0;i<6;s+=(d[i]%=30)*++i)
    scanf("%d",d+i);
  f(s/2,6);
  s&&main(printf("Collection #%d:\nCan%s be divided.\n\n",++t,s%2|!k?"'t":""));
}

さっき、目に付くところだけざざっと削りましたが、ぱっと見が変数多いし汚い。ということはもっともっと縮むんじゃないかなーと思います。今までの最短コードを見るかぎり、mainの再帰で短くなる事は稀だし。。