#include<iostream>
using namespace std;
#define C 10
int V[6][11];
int x[5];
int KnapSack(int n, int w[], int v[]);
int max(int x, int y);
void printV();
int main()
{
int w[] = { 6, 5, 4, 2, 1 };
int v[] = { 5, 3, 5, 3, 2 };
cout << "背包的最大价值为:" << KnapSack(5, w, v) << endl;
cout << "装入背包的物品是:";
for (int i = 0; i < 5; i++)
{
if (x[i]==1)
{
cout << "物品" << i + 1;
}
}
printf("\n");
printV();
cout << endl;
return 0;
}
int max(int x, int y){
if (x>y)
{
return x;
}
else
{
return y;
}
}
int KnapSack(int n, int w[], int v[]){
int i, j;
for ( i = 0; i <=n; i++)
{
V[i][0] = 0;
}
for ( j = 0; j <=C; j++)
{
V[0][j] = 0;
}
for (i = 1; i <=n; i++)
{
for ( j = 1; j <= C; j++)
{
if (j<w[i-1])
{
V[i][j] = V[i - 1][j];
}
else
{
V[i][j] = max(V[i - 1][j], V[i-1][j-w[i-1]]+v[i-1]);
}
}
}
for ( j = C,i=n; i>0; i--)
{
if (V[i][j]>V[i-1][j])
{
x[i-1] = 1;
j = j - w[i-1];
}
else
{
x[i-1] = 0;
}
}
return V[n][C];
}
void printV(){
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < C+1; j++)
{
if (j==0)
{
printf("%d\t", i);
}
else
{
printf("%d\t", V[i][j - 1]);
}
}
printf("\n");
}
}