#include <bits/stdc++.h>
using namespace std;
int m[5][10];
int ValueBestGet(int c)
{//获取问题最优值
return m[0][c-1];
}
void WayBestGet(int *w, int n, int c)
{//获取最优装载方案
int flag = 0;
for(int i =0;i<n-1;i++)
{
if(flag == 0)
{
printf("最优装载方案为: ");
flag+=1;
}
if(m[i][c-1] != m[i+1][c-1])
{//当前物品的最优价值与上一物品的
//最优价值相同说明该物品未被装入
printf("%d ", i+1);
c -= w[i];
}
}
//处理第n个物品装入
if(m[n-1][c-1] != 0)
printf("%d", n);
printf("\n");
}
void Knapsack(int *w, int *v, int n, int c)
{//获取最优值表
for(int i = n-1;i >= 0;i--)
{
for(int j = 0;j < c; j++)
{
if(i == n-1 && j < w[i])//当物品为第一个奖杯装入的物品
m[i][j] = 0; //且重量大于当前背包容量
else if(i == n-1 && j >= w[i])//当物品为第一个奖杯装入的物品
m[i][j] = v[i]; //且重量小于当前背包容量
else if(j < w[i])//当前物品重量大于当前背包容量
m[i][j] = m[i+1][j];
else//当前物品重量小于当前背包容量
m[i][j] = max(m[i+1][j], m[i+1][j-w[i]]+v[i]);//填入上一物品装入的价值
//与该物品装入的价值的最大值
}
}
}
int main()
{
//样例数据
int n = 5;
int c = 10;
int w[5] = {2,2,6,5,4};
int v[5] = {6,3,5,4,6};
int ans;
//背包问题处理
Knapsack( w, v, n, c);
ans = ValueBestGet(c);
WayBestGet( w, n ,c);
//输出
printf("最优值: %d", ans);
return 0;
}