長さ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)が可能かを検証すれば全ての組み合わせを試すことができる。
50時間以内に解けるかな?
Re: 50時間以内に解けるかな?
50時間以内に解けるかな?関連の一連の3つの投稿が、すべて同一人物によるものだと仮定して書きます。
もし違っていたらすみません。
フォーラムルールにもあります通り
ご注意を。
もし違っていたらすみません。
フォーラムルールにもあります通り
フォーラムルール さんが書きました:なるべくオリジナルな名前を決め、以後同じ名前を使い続けてください。
とのことです。フォーラムルール さんが書きました:課題の丸投げ(問題文だけ書く事)は禁止です。
どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、
回答者さん達の理解を求めるようにしましょう。
ご注意を。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 50時間以内に解けるかな?
同じ方からの投稿である他の2つに付いては凍結させて頂きました。
まず、こちらの問題を解くお手伝いをさせて頂きますのでフォーラムルールをお読みになっていただいて、それに沿った投稿をお願いします。
http://dixq.net/board/board.html
まず、こちらの問題を解くお手伝いをさせて頂きますのでフォーラムルールをお読みになっていただいて、それに沿った投稿をお願いします。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ikarara2
Re: 50時間以内に解けるかな?
こんにちは、ikarara2(ダブル)です。
面白そうなのでサクッと問いちゃいました。
申し訳ないですが同じ学内の投稿で自作自演の可能性もあるのでhiddenとさせて頂きます。 by softya(ソフト屋)
面白そうなのでサクッと問いちゃいました。
申し訳ないですが同じ学内の投稿で自作自演の可能性もあるのでhiddenとさせて頂きます。 by softya(ソフト屋)
- tk-xleader
- 記事: 158
- 登録日時: 15年前
- 連絡を取る:
Re: 50時間以内に解けるかな?
D言語が選択肢にある時点で、ちょっと課題の丸投げってのは考えづらい(D言語を授業や研修で使ってるところがあるとは思えないですから…)ですね。
これはここのメンバーに対する挑戦状として理解しましたが、それでよろしいですかね?
これはここのメンバーに対する挑戦状として理解しましたが、それでよろしいですかね?
Re: 50時間以内に解けるかな?
解いてみました。
問題を見てから50時間以内です。(5時間も経ってません) 使用可能な言語からAOJの問題かと思いましたが、違うようですね。
問題を見てから50時間以内です。(5時間も経ってません) 使用可能な言語からAOJの問題かと思いましたが、違うようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)