背包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];
}
posted @ 2024-06-30 09:11  uanQ  阅读(2)  评论(0编辑  收藏  举报