ページ 11

50時間以内に解けるかな?

Posted: 2012年5月22日(火) 03:42
by Brute Force
 長さnの数列Aと整数Mに対して、Aの要素の中のいくつかの要素を足しあわせてMが作れるかどうかを判定するプログラムを作成せよ。
Aの各要素は1度だけ使うことができる。
数列Aが与えられたうえで、質問としてq個のMが与えれるので、それぞれについて"yes"または"no"と出力せよ。
プログラムはC, C++, JAVA, C++11, C#, Dいずれかの言語で作成すること。

入力
 1行目にn、2行目にAを表すn個の整数、3行目にq、4行目にq個の整数Miが与えられる。
出力
 各質問についてAの要素を足しあわせてMiを作ることができればyesと、できなければnoと出力せよ。

制約
n ≤ 20
q ≤ 200
1 ≤ Aの要素 ≤ 2000
1 ≤ Mi ≤ 2000

入力例 1

5
1 5 7 10 21
8
2 4 17 8 22 21 100 35

出力例 1

no
no
yes
yes
yes
yes
no
no

ヒント!
 この問題は、総当たり探索によって解くことができる。
solve(p, t)をp番目以降の要素を使ってtを作れるかを判定する関数とすれば:

solve(0, M)
solve(1, M-{1番目より前の数を使ってできた和})
solve(2, M-{2番目より前の数を使ってできた和})
...

を再帰的に呼び出して検証すればよい。
各再帰関数においてp番目の要素を使った場合・使わなかった場合で2つの再帰関数を呼ぶ。
つまり、solve(p, t)においてsolve(p+1, t-A[p]), solve(p+1, t)が可能かを検証すれば全ての組み合わせを試すことができる。

Re: 50時間以内に解けるかな?

Posted: 2012年5月22日(火) 07:02
by beatle
50時間以内に解けるかな?関連の一連の3つの投稿が、すべて同一人物によるものだと仮定して書きます。
もし違っていたらすみません。

フォーラムルールにもあります通り
フォーラムルール さんが書きました:なるべくオリジナルな名前を決め、以後同じ名前を使い続けてください。
フォーラムルール さんが書きました:課題の丸投げ(問題文だけ書く事)は禁止です。
どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、
回答者さん達の理解を求めるようにしましょう。
とのことです。
ご注意を。

Re: 50時間以内に解けるかな?

Posted: 2012年5月22日(火) 11:01
by softya(ソフト屋)
同じ方からの投稿である他の2つに付いては凍結させて頂きました。
まず、こちらの問題を解くお手伝いをさせて頂きますのでフォーラムルールをお読みになっていただいて、それに沿った投稿をお願いします。
http://dixq.net/board/board.html

Re: 50時間以内に解けるかな?

Posted: 2012年5月22日(火) 17:57
by ikarara2
こんにちは、ikarara2(ダブル)です。
面白そうなのでサクッと問いちゃいました。

申し訳ないですが同じ学内の投稿で自作自演の可能性もあるのでhiddenとさせて頂きます。 by softya(ソフト屋)
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

Re: 50時間以内に解けるかな?

Posted: 2012年5月24日(木) 01:41
by tk-xleader
D言語が選択肢にある時点で、ちょっと課題の丸投げってのは考えづらい(D言語を授業や研修で使ってるところがあるとは思えないですから…)ですね。

これはここのメンバーに対する挑戦状として理解しましたが、それでよろしいですかね?

Re: 50時間以内に解けるかな?

Posted: 2012年5月24日(木) 20:34
by naohiro19
No.4のコードはコンパイルがとおりません。

Re: 50時間以内に解けるかな?

Posted: 2012年5月25日(金) 15:14
by みけCAT
解いてみました。
問題を見てから50時間以内です。(5時間も経ってません)
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。
使用可能な言語からAOJの問題かと思いましたが、違うようですね。

Re: 50時間以内に解けるかな?

Posted: 2012年5月25日(金) 15:30
by みけCAT
ヒントを参考に解いてみました。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。