此题与宠物之收服那题差不多
f[i][j][k]状态表示:
前i件物品,使用物品总重量不超过j且使用物品总体积不超过k.
状态计算:
1、不要a[i]: f[i - 1][j][k];
2. 要a[i],(则必须j >= m[i], k >= v[i]) f[i - 1][j - m[i]][k - v[i]] + w[i];
代码实现:
# include <iostream>
using namespace std;
const int N = 1010, V = 110 , M = 110;
int v[N],m[N],w[N];
// int f[N][M][V]; //三维
int f1[V][M];
int n,m1,v1;
int main()
{
scanf("%d %d %d",&n,&v1,&m1);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d %d %d",&v[i],&m[i],&w[i]);
}
/* // 三维
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <= m1 ; j++)
{
for(int t = 0 ; t <= v1 ; t++)
{
f[i][j][t] = f[i - 1][j][t];
if(j >= m[i] && t >= v[i])
{
f[i][j][t] = max(f[i][j][t] , f[i - 1][j - m[i]][t - v[i]] + w[i]);
}
}
}
}
printf("%d\n",f[n][m1][v1]);
*/
// 二维
for(int i = 1 ; i <= n ; i++)
{
for(int j = m1 ; j >= m[i] ; j--)
{
for(int t = v1 ; t >= v[i] ; t--)
{
f1[j][t] = max(f1[j][t] , f1[j - m[i]][t - v[i]] + w[i]);
}
}
}
printf("%d\n",f1[m1][v1]);
return 0;
}