これも★3か迷うところ。でも★2よりはややこしいかな。
http://yukicoder.me/problems/32
問題
長さがV0,V1,V2,V3の4つの板を作りたい。
そのため、3種類の長さの板を無限に準備できる。
これらの板は、切断は出来ないが連結は可能である。
4つの板を作るのに必要な最小の板の数を求めよ。
解法
Viは30以下なので、準備する板の長さも30以下で良い。
よって3つの板の長さを1~30で総当たりする。
あとはその3つの長さで4つの板を作れるか、メモ化再帰やDPで求めればよい。
int V[4]; int A,B,C; int memo[51]; int dodo(int D) { if(D==0) return 0; if(D<0) return 1000; if(memo[D]>=0) return memo[D]; return memo[D]=1+min(min(dodo(D-A),dodo(D-B)),dodo(D-C)); } void solve() { int i,j,k,l,r,x,y; string s; cin>>V[0]>>V[1]>>V[2]>>V[3]; int mi=V[0]+V[1]+V[2]+V[3]; for(A=1;A<=30;A++) for(B=A+1;B<=30;B++) for(C=B+1;C<=30;C++) { MINUS(memo); mi=min(mi,dodo(V[0])+dodo(V[1])+dodo(V[2])+dodo(V[3])); } cout << mi << endl; }
まとめ
yukicoderはしばしば難易度補正が入るので、時々チェックしないとね。