#include<iostream>
using namespace std;
int weight[6] = { 0 , 6 , 5 , 4 , 2, 1};
int v[6] = { 0 , 5 , 3 , 5 , 3 , 2};
int max_weight = 10;
int dp[6][11] = { { 0 } };
int item[6];
void display();
void list(int i,int j);
void findMax()
{
int max_value = 0;
for (int i = 1; i < 6; i++)
{
for (int j = 1; j <= max_weight; j++)
{
if (j < weight[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + v[i]);
}
}
cout<<"输出动态表"<<endl;
for (int i = 1; i < 6; i++)
{
for (int j = 1; j < 11; j++) {
cout << dp[i][j] << ' ';
}
cout << endl;
}
for(int x=0;x<6;x++)
for(int y=0;y<11;y++)
{
if(max_value<=dp[x][y])
{
max_value=dp[x][y];
}
}
cout<<"max value is "<<max_value<<endl;
for(int x=0;x<6;x++)
for(int y=0;y<11;y++)
{
if(max_value==dp[x][y])
{
list(x,y);
}
}
}
void list(int i,int j)
{
if (i > 0)
{
if (dp[i][j] == dp[i - 1][j]) {
item[i] = 0;
list(i - 1, j);
}
else if (j - weight[i] >= 0 && dp[i][j] == dp[i - 1][j - weight[i]] + v[i])
{
item[i] = 1;
list(i - 1, j - weight[i]);
}
}
}
void display()
{
cout<<"1代表选择,0代表不选择"<<endl;
cout<<"object 1 2 3 4 5"<<endl<<"select ";
for (int i = 1; i < 6; i++)
cout <<item[i] <<" ";
cout << endl;
}
int main()
{
findMax();
display();
}