背包DP——二维费用背包
二维费用背包
在简单背包的1个费用下增加到2个费用
做法也从一维dp变成二维dp(给另一个的费用),进行三层循环;
例题
https://www.luogu.com.cn/problem/P1855
题目描述
输入格式
第一行三个整数 \(n,M,T\),表示一共有 \(n\)(\(1 \le n \le 100\))个愿望, kkksc03 的手上还剩 \(M\)(\(0 \le M \le 200\))元,他的暑假有 \(T\)(\(0 \le T \le 200\))分钟时间。
第 \(2\)~\(n+1\) 行 \(m_{i}\) , \(t_{i}\) 表示第 \(i\) 个愿望所需要的金钱和时间。
输出格式
一行,一个数,表示 kkksc03 最多可以实现愿望的个数。
样例 #1
样例输入 #1
6 10 10
1 1
2 3
3 2
2 5
5 2
4 3
样例输出 #1
4
Code
点击查看代码
const int maxn = 1e7 + 10;
int n, M, T;
int m[110], t[110];
int dp[210][210];
void solve() {
cin >> n >> M >> T;
for (int i = 1; i <= n; i++) {
cin >> m[i] >> t[i];
}
for (int i = 1; i <= n; i++) {
for (int j = M; j >= m[i]; j--) {
for (int k = T; k >= t[i]; k--) {
dp[j][k] = max(dp[j][k], dp[j - m[i]][k - t[i]] + 1);
}
}
}
cout << dp[M][T];
}