このコードではナップサック問題を解く際に、int dp[MAX_N+1],v[MAX_W+1]; と配列を作成していますが、error: ISO C90 forbids variable length array â [-Werror=vla]このようなエラーが出ます。そのため動的に配列を作成しようとしたのですが、下記のようなコードでいいのでしょうか?なぜMAX_N+1をしているのかがわかりませんでした。
C
1 dp = malloc(sizeof(int *) * (MAX_N+1)); 2 for (i=0;i<MAX_N+1;i++) { 3 dp[i] = malloc(sizeof(int) * (MAX_W+1)); 4 } 5
C
1https://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/ 2から引用。 3 4const int MAX_N = 1000; // nの最大値 5const int MAX_W = 5000; // Wの最大値 6 7// 入力 8int n, W; 9int w[MAX_N], v[MAX_N]; 10 11// DPテーブル 12// dp[i][j]はi番目以降の品物から重さの和がj以下なるように選んだときの価値の和の最大値を表す。 13int dp[MAX_N + 1][MAX_W + 1]; 14 15void solve_dp2() { 16 for (int j = 0; j <= W; j++) { 17 dp[n][j] = 0; 18 } 19 for (int i = n - 1; i >= 0; i--) { 20 for (int j = 0; j <= W; j++) { 21 if (j < w[i]) 22 dp[i][j] = dp[i + 1][j]; 23 else 24 dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + v[i]); 25 } 26 } 27 cout << dp[0][W] << endl; 28}
malloc 使わなくても、const int MAX_N = 1000; を #define MAX_N 1000 にすれば良いのでは。
https://teratail.com/questions/79817
