私はこのアルゴリズムをテキストブックから実装しようとしています。再帰アルゴリズムを使ってナップザックを解く
私はこれを書いた:ここ
// Knapsack_memoryfunc.cpp : Defines the entry point for the console application.
//Solving Knapsack problem using dynamic programmig and Memory function
#include "stdafx.h"
#include "iostream"
#include "iomanip"
using namespace std;
int table[20][20] = { 0 };
int value, n, wt[20], val[20], max_wt;
// ---CONCERNED FUNCTION-----
int MNSack(int i, int j)
{
value = 0;
if (table[i][j] < 0)
if (j < wt[i])
value = MNSack(i - 1, j);
else
value = fmax(MNSack(i - 1, j), val[i] + MNSack(i - 1, j - wt[i]));
table[i][j] = value;
return table[i][j];
}
// --------------------------
void items_picked(int n, int max_wt)
{
cout << "\n Items picked : " << endl;
while (n > 0)
{
if (table[n][max_wt] == table[n - 1][max_wt]) // if value doesnot change in table column-wise, item isn't selected
n--; // n-- goes to next item
else // if it changes, it is selected
{
cout << " Item " << n << endl;
max_wt -= wt[n]; // removing weight from total available (max_wt)
n--; // next item
}
}
}
int main()
{
cout << " Enter the number of items : ";
cin >> n;
cout << " Enter the Maximum weight : ";
cin >> max_wt;
cout << endl;
for (int i = 1; i <= n; i++)
{
cout << " Enter weight and value of item " << i << " : ";
cin >> wt[i] >> val[i];
}
for (int i = 0; i <= n; i++)
for (int j = 0; j <= max_wt; j++)
table[i][j] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= max_wt; j++)
table[i][j] = -1;
cout << " Optimum value : " << MNSack(n, max_wt);
cout << " \n Table : \n";
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= max_wt; j++)
if (table[i][j] == -1)
cout << setw(5) << "-";
else
cout << setw(5) << table[i][j];
cout << endl;
}
items_picked(n, max_wt);
return 0;
}
それは最適値のようないくつかの場所でその正しいように思える、まだないです十分に受け入れられる。 私はそれをデバッグしようとしましたが、再帰的な関数では非常に難しいです。誰かが助けてくれますか?
ヘイリー、私はヘンリーリーの答えは正しいと思っていますが、それでも後であなたに何かを与えたいと思っています。 Urコードはちょっとひどく、この問題を解決する方法はプログラマーの下でのメモ作成と呼ばれています。これは私をたくさん助け、コードの美しさをより美しくすることができる美しいblogpostです。 http://programminggenin.blogspot.de/2013/01/memoization-in-c.html – Mehno
@Mehnoあなたは精緻化できますか?アルゴリズムは、私が理解するように、必要な値だけを計算します。どのように私はそれを実装することができますか? – LonelyC
@Mehnoはあなたのコーディングスタイルをより良くするテクニックを提案しました。あなたのアルゴリズムに悪いことはありません。しかし、興味があれば、同じ問題を解決するためにボトムアップの動的プログラミングを使用する方法を示し、行数はごくわずかであり、コードをはるかに良くすることができます。 – HenryLee