前提・実現したいこと
ナップサック問題を解いています、二次元配列を用いて実現する方法はわかりました。
次に一次元配列を二つ使用する方法や、一つだけ使用して実現する方法を考えているのですが、いまいちどのようにコードを書けばよいかがわかりません。
どうかよろしくお願いします。
発生している問題
ナップサック問題を二次元配列を用いずに実現したい。
ソースコードにある二次元配列dpを一次元配列で実現させたい。
ここら辺をどうすればいいか悩んでいます
for(i=0;i<=N;i++){ for(j=0;j<=M;j++){ int x,y=-1; if(i!=0){ x = dp[i-1][j]; if(j>=w[i])y = dp[i-1][j-w[i]]+v[i]; if(x>y)dp[i][j]=x; else dp[i][j]=y;
該当のソースコード
c
1#include <stdio.h> 2#define M 10 3#define N 5 4 5int w[N+1]={0,2,3,4,5,6}; 6int v[N+1]={0,4,5,8,9,11}; 7int dp[M+1][M+1]; 8 9int main(void){ 10 int i,j,k; 11 for(i=0;i<=M;i++)for(j=0;j<=M;j++)dp[i][j]=0; 12 13 for(i=0;i<=N;i++){ 14 for(j=0;j<=M;j++){ 15 int x,y=-1; 16 if(i!=0){ 17 x = dp[i-1][j]; 18 if(j>=w[i])y = dp[i-1][j-w[i]]+v[i]; 19 if(x>y)dp[i][j]=x; 20 else dp[i][j]=y; 21 } 22 printf("%2d ",dp[i][j]); 23 } 24 printf("\n"); 25 } 26 printf("\nanswer = %d\n",dp[N][M]); 27 return 0; 28}
補足情報(FW/ツールのバージョンなど)
c言語
>いまいちわかりません
何が分からないのか分かりません。
まずは、「ナップサック問題 一次元 配列」あたりで検索しましょう。
以下のページにも、まずは自分で検索するように書かれています。
質問するときのヒント
1-2. 投稿前に検索し、できるところまで自分でやってみましょう
https://teratail.com/help/question-tips#questionTips1-2
回答3件
あなたの回答
tips
プレビュー