二维费用背包&分组背包
01二维费用背包模型
dp[i];体积为i,重量为j
时间复杂度O(NxVxM) 1e3x1e2x1e2=1e7
10 50 50 10 10 10 20 20 100 30 30 120 40 40 160 50 50 200 60 60 240 70 70 280 80 80 320 90 90 360 100 100 400 =>220 #include<bits/stdc++.h> using namespace std; using namespace std; using ll = long long; const int N = 105; ll dp[N][N]; int main() { int n, V, M; cin >> n >> V >> M; for (int i = 1; i <= n; i++){ int v, m, w; cin >> v >> m >> w; for (int j=V;j>=v;--j) for (int k = M; k >= m; --k) dp[j][k] = max(dp[j][k], dp[j - v][k - m] + w); } cout << dp[V][M] << "\n"; return 0; }
分组背包模型
状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v)
3 58
2
1 4
1 6
1
4 9
2
5 5
4 5
=>20
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 150;
ll dp[N][N];
int main()
{
int n, V; cin >> n >> V;
for (int i = 1; i <= n; i++){
int s; cin >> s;
for (int j = 0; j <= V; ++j)dp[i - 1][j];
while (s--){
int w, v; cin >> w >> v;
for (int j = w; j <= V; ++j)dp[i][j] = max(dp[i][j], dp[i - 1][j - w] + v);
}
}
cout << dp[n][V] << "\n";
return 0;
}