#include <iostream>
#include<iomanip>
using namespace std;
#include <stdio.h>
#include <math.h>
#define N 6
#define maxT 1000
int c[N][maxT] = { 0 };
int Calucate_MValue(int v[N], int w[N], int i, int j) {
cout <<"-------------"<< setw(3) << i << setw(5) << j << setw(5) << c[i][j] << endl;
int temp = 0;
if (c[i][j] != -1) {
temp = c[i][j];//继续
}
if (i == 0 || j == 0) {
c[i][j] = 0;
}
else {
c[i][j] = Calucate_MValue(v, w, i - 1, j);//不放第i个
if (j >= w[i]) {//还能继续放
/* cout << "--------------------能继续放第" << i << "个" << endl;*/
temp = Calucate_MValue(v, w, i - 1, j - w[i]) + v[i]; //放第i个
if (c[i][j] < temp) {//放了会更大
c[i][j] = temp;//保留最大
}
}
else {
cout << "+++++++++++++++++++不能继续放第"<<i<<"个" << endl;
}
}
cout << "+++++++++++++" << setw(3) << i << setw(5) << j << setw(5) << c[i][j] << endl;
return c[i][j];
}
int Meoized_ksack(int v[N], int w[N], int T) {
int i;
int j;
for (i = 0; i < N; i++) {
for (j = 0; j <= T; j++) {
c[i][j] = -1;
}
}
return Calucate_MValue(v, w, N - 1, T);
}
int main() {
int v[N] = { 0,1,6,18,22,28 }, w[] = { 0,1,2,5,6,7 };
//int v[N] = { 0,1,6 }, w[] = { 0,1,2 };
int r = Meoized_ksack(v, w, 11);
std::cout << r << std::endl;
}