include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
const int N = 1010;
int v[N], m[N],w[N];
//int mem[N][N][N];//数组过大,会导致编译错误,需要滚动
int nn, mm, vv;
int g[N][N];
int dfs(int x,int spv,int spm)//顺序递归
{
int t;
if (x>nn)//也是终点
{
return 0;//边界,指在背包允许的前提下,从第x个物品到最后一个物品可得的最大价值,这里显然不存在这种拿法,价值应该为0
}
else if (spv<v[x]||spm<m[x])
{
t = dfs(x+1,spv,spm);//返回从第x+1个物品到最后一个物品在背包允许的前提下可以获得的最大价值,因为第x个物品你没拿,没有增加价值
}
else
{
t = max(dfs(x + 1, spv, spm),dfs(x+1,spv-v[x],spm-m[x]) + w[x]);//返回第x+1个物品在背包允许的前提下可以获得的最大价值(拿第x个物品与不拿第x+1个物品中取最大价值)
}
return t;
}
int dfs2(int x,int spv,int spm)//逆序递归:表示的含义,从第x个物品到第一个物品在背包允许的条件下,所能装的最大价值
{
if (x<1)
{
return 0;//边界,也是终点
}
else if(spv < v[x] || spm < m[x])
{
return dfs2(x - 1, spv, spm);
}
else
{
return max(dfs2(x - 1, spv, spm), dfs2(x - 1, spv - v[x], spm - m[x]) + w[x]);
}
}
int main()
{
scanf(“%d %d %d”, &nn,&vv,&mm);
for (int i = 1;i<=nn;i++)
{
scanf(“%d %d %d”,&v[i],&m[i],&w[i]);
}
//在不超过背包的最大容量和最大承重的情况下,尽可能装出最大价值
//影响边界的变量有:物品数,背包的容量和最大承重
//已知边界:顺序递归(dfs n+1 = 0)
//dfs函数的意义:指在背包允许的前提下,从第x个物品到最后一个物品可得的最大价值,
/*int res = dfs2(nn,vv,mm);
printf("%d\n", res);*/
for (int i = nn;i>=1;i--)
{
for (int j = vv;j>=v[i];j--)
{
for (int k = mm;k>=m[i];k--)
{
g[j][k] = max(g[j][k],g[j-v[i]][k-m[i]] + w[i]);
//原本的g[i][j][k]的含义:从第i个物品开始,背包容量为j,可承重为k时,背包所能装的最大价值(从第i到最后总共的价值)
//g[j][k]数组的含义:体积为j,可承重为k时,背包所能装的最大价值
}
}
}
printf("%d",g[vv][mm]);
}