AcWing 8. 二维费用的背包-朴素三维到二维
原题链接
中等
作者:
rushhhhh
,
2021-02-12 12:42:09
,
所有人可见
,
阅读 392
朴素三维做法
#include <iostream>
using namespace std;
const int N = 1010;
const int N2 = 105;
int n, V, M;
int f[N][N2][N2];
int v[N], m[N], w[N];
/*
dp:
1、状态表示f[i][j][k]
1.1集合
在前i件物品中选,且总体积不超过j、总重量不超过k的选法的总价值
1.2属性
最大值,所以取max
2、状态计算
f[i][j][k] = max(f[i-1][j][k], f[i-1][j-v][k-m]+w)
其中,f[i-1][j][k]表示不选第i件物品
f[i-1][j-v][k-m]+w表示选第i件物品
*/
int main()
{
cin >> n >> V >> M;
for(int i=1; i<=n; i++)
cin >> v[i] >> m[i] >> w[i];
for(int i=1; i<=n; i++)
{
for(int j=0; j<=V; j++)
{
for (int k = 0; k <= M; k++)
{
f[i][j][k] = f[i-1][j][k];
if(j>=v[i] && k>=m[i])
f[i][j][k] = max(f[i][j][k], f[i-1][j-v[i]][k-m[i]]+w[i]);
}
}
}
cout << f[n][V][M];
return 0;
}
利用滚动数组优化成二维
#include <iostream>
using namespace std;
const int N = 1010;
const int N2 = 105;
int n, V, M;
int f[N2][N2];
int v[N], m[N], w[N];
int main()
{
cin >> n >> V >> M;
for(int i=1; i<=n; i++)
cin >> v[i] >> m[i] >> w[i];
for(int i=1; i<=n; i++)
for(int j=V; j>=v[i]; j--)
for (int k = M; k >= m[i]; k--)
f[j][k] = max(f[j][k], f[j-v[i]][k-m[i]]+w[i]);
cout << f[V][M];
return 0;
}