http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0030
正直全然わからなかったので調べてみると、どうやら深さ優先探索(Depth First Search)なることをするようです。ここでiは足す数、sは現在の合計(Sumが最終目標の合計)、nがあと何回足すかを表しています。
dfs(i+1,s+i,n-1); //1 dfs(i+1,s,n); //2
この分岐にそれぞれ①②と番号をふったとすると、
①は足し算で②は場合分けの方向に分かれています。
画像はその時のメモです。(分かりづらい上にきたない…)
s == Sum かつ n == 0となれば、ひとつの組み合わせが見つかったので答えにカウントされます。
参考サイト(http://d.hatena.ne.jp/print7/20111004/1317697039)
以下、提出したソースコードです。
#include <stdio.h> int ans,Sum; void dfs(int i,int s,int n) { if(s == Sum && n == 0) { ans++; return; } if(i == 10 || n == 0) return; dfs(i+1,s+i,n-1); dfs(i+1,s,n); } int main(void) { int n; while(scanf("%d %d",&n,&Sum) != EOF) { if (n == 0 && Sum == 0) break; ans = 0; dfs(0,0,n); printf("%d\n", ans); } return 0; }
0 件のコメント:
コメントを投稿