質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1510閲覧

C言語、動的計画法の動きを教えてほしい

Satsumaimo

総合スコア0

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/23 06:14

基本情報技術者試験対策として、今C言語の動的計画法を勉強しています。
そこでどうしても分からない壁にぶち当たりました。
ナップザック問題なのですが、重さ1価値2のAと、重さ2価値6のBを、任意の重さVに収まるように選択し最も価値を高くさせるというものです。おそらく、最もスタンダードな形のナップザック問題です。
この問題のプログラムが

C言語

1#include <stdio.h> 2int main(void) 3{ 4int N = 2; 5int size[2] = {1, 2}; 6int value[2] = {2, 6}; 7 8int V; 9printf("ナップザックの容量制限入力"); 10scanf("%d", &V); 11int maxvalue[V]; 12int choice[V]; 13 14for(int k = 0; k <= V; k++){ 15maxvalue[k] = 0; 16choice[k] = -1; 17} 18 19/*動的計画法のメイン。分からない部分*/ 20for(int s = 0; s <= N-1; s++){ 21for(int t = size[s]; t <= V; t++){ 22int temp = maxvalue[t-size[s]] + value[s]; 23if(temp > maxvalue[t]){ 24maxvalue[t] = temp; 25choice[t] = s; 26} 27} 28} 29 30int k = V; 31while(choice[k] >= 0){ 32printf("choice[k] = %d\n", choice[k]); 33k = k - size[choice[k]]; 34} 35 36printf("価値合計 = %d\n", maxvalue[V]); 37return 0; 38}

です。
コードにコメントしているように、動的計画法のメインとなる部分の意味が分かりません。
どうしてこれでうまく動くのでしょうか。
最初のfor文(s=0の方)があれば常にAか常にBを入れるという動作になってしまう気がするのですが、どうしてならないのでしょうか。
よろしければs=1のときtmpがこの値になって…など具体的な説明も交えて頂けるとありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

最初のfor文(s=0の方)があれば常にAか常にBを入れるという動作になってしまう気がするのですが、どうしてならないのでしょうか。

最初に「Aばかりを入れた状態」で仮のmaxvalueを作っていきます。次に、Bに入れ替えてより多く詰められるようになるならmaxvalueを「Bも入れたものに更新していく」という流れです。

投稿2021/03/23 06:19

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satsumaimo

2021/03/23 09:27

回答ありがとうございます! maxvalueにAばかり入れた後、 int temp = maxvalue[t-size[s]] + value[s]; でBを入れて if(temp > maxvalue[t]){ maxvalue[t] = temp; でBを入れた方が大きければそっちを採用、ということでいいでしょうか? maxvalue[t-size[s]] になっているのは、tのときに入っているAをどけて、代わりにBを入れている動作ということであっていますでしょうか? 返信いただければ幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問