//knap.h
#ifndef _KNAP_H_
#define _KNAP_H_
typedef struct node
{
int size;
int val;
node() { size = 0; val = 0;}
node(int x,int v) { size = x; val = v;}
} Item;
class knap
{
public:
knap();
int getValue(int);
int maxKnown[18];
Item items[5];
};
#endif
//knap.cpp
#include "knap.h"
#include <iostream>
knap::knap()
{
for(int i = 0; i < 18; ++i)
{
maxKnown[i] = -1;
}
items[0] = Item(3,4);
items[1] = Item(4,5);
items[2] = Item(7,10);
items[3] = Item(8,11);
items[4] = Item(9,18);
}
int knap::getValue(int M)
{
int i,space,max,maxi = 0,t;
if(maxKnown[M] != -1) return maxKnown[M];
for(i = 0, max = 0; i < 5; ++i)
{
if((space = M - items[i].size) >= 0)
if((t = getValue(space) + items[i].val) > max)
{
max = t; maxi = i;
}
}
maxKnown[M] = max;
return max;
}
//main.cpp
#include "knap.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv [])
{
knap kk;
cout<<kk.getValue(17) << endl;
while(cin.get());
return 0;
}
背包问题的动态编程实现
背包大小17,各个组合条件见items数组.