Bu algoritmayı ders kitabımızdan uygulamaya çalışıyorum. Henüz,
Özyinelemeli algoritma kullanarak Sırt Çantası Çözümü
Optimum değer gibi bazı yerlerde onun doğru gibi görünüyor değildir: Burada
// 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;
}
soru çıktısı:
Bunu yazdım tamamen kabul edilebilir. Hata ayıklamayı denedim, ancak özyinelemeli işlevleri ile oldukça zor. Birisi lütfen yardım edebilir mi?
Heyho, HenryLee'nin cevabının doğru olduğunu düşünüyorum, ancak yine de size daha sonra bir şeyler vermek istiyorum. Ur kodu biraz korkunç, ve bu problemi çözme biçimine programcılar altında hatırlatma denir. Bu bana çok yardımcı olan ve kodunuzu daha güzel hale getirebilecek güzel bir blog postası. http://programminggenin.blogspot.de/2013/01/memoization-in-c.html – Mehno
@Mehno Ayrıntı yapabilir misiniz? Algoritma, anladığım kadarıyla, yalnızca gerekli değerleri hesaplar. Bunu ne kadar iyi uygulayabilirim? – LonelyC
Ne @Mehno, kodlama stilinizi daha güzel kılan bir teknikti. Algoritmanınızda kötü bir şey yok. Bununla birlikte, eğer ilgileniyorsanız, aynı problemi çözmek için aşağıdan yukarıya dinamik bir programlamanın nasıl kullanılacağını gösterebilirim ki bu da çok az sayıda satır alır ve kodu daha güzel yapar. – HenryLee