https://www.luogu.com.cn/problem/P1509
// // Problem:
// // P1509 找啊找啊找GF
// //
// // Contest: Luogu
// // URL: https://www.luogu.com.cn/problem/P1509
// // Memory Limit: 125 MB
// // Time Limit: 1000 ms
// //
// // Powered by CP Editor (https://cpeditor.org)
//
// // Problem: A. A+B Again?
// // Contest: Codeforces - Codeforces Round 964 (Div. 4)
// // URL: https://codeforces.com/contest/1999/problem/A
// // Memory Limit: 256 MB
// // Time Limit: 1000 ms
// //
// // Powered by CP Editor (https://cpeditor.org)
//
#include <bits/stdc++.h>
using namespace std;
struct Node {
int rmb, rp, time;
} g[110];
int dp[110][110];
int dptime[110][110];
int n;
int main() {
cin >> n;
int m, r;
for (int i=1;i<=n;i++) {
cin >> g[i].rmb >> g[i].rp >> g[i].time;
}
cin >> m >> r;
for (int i=1;i<=n;i++) {
// rp
for (int j=r;j>=g[i].rp;j--) {
// rmb
for (int k=m;k>=g[i].rmb;k--) {
if (dp[j][k] < dp[j-g[i].rp][k-g[i].rmb] + 1){
dp[j][k] = dp[j-g[i].rp][k-g[i].rmb]+1;
dptime[j][k] = dptime[j-g[i].rp][k-g[i].rmb] + g[i].time;
}
else if(dp[j][k] == dp[j-g[i].rp][k-g[i].rmb] + 1) {
dptime[j][k] = min( dptime[j][k], dptime[j-g[i].rp][k-g[i].rmb] + g[i].time );
}
}
}
}
// // r 人品 m 钱
// for (int i=0;i<=r;i++) {
// for (int j=0;j<=m;j++) {
// cout << dptime[i][j] << " ";
// }
// cout << endl;
// }
cout << dptime[r][m];
return 0;
}
循环中为什么不能写成这样?
dp[j][k] = max(dp[j][k], dp[j-g[i].rp][k-g[i].rmb]+1);
dptime[j][k] = min( dptime[j][k], dptime[j-g[i].rp][k-g[i].rmb] + g[i].time );
为什么再在前面加上初始化也不行?
for (int i=0;i<=r;i++) {
for (int j=0;j<=m;j++) {
dptime[i][j] = 1e9;
}
}
dptime[0][0] = 0;
求解,是因为dp数组不可以还是因为dptime不可以