基本情報技術者試験対策として、今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がこの値になって…など具体的な説明も交えて頂けるとありがたいです。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/23 09:27