洛谷 P1855 榨取kkksc03 题解

题目大意

洛谷 P1855 榨取kkksc03

多维背包模板题。

给定 \(n\) 个愿望,第 \(i\) 个愿望所需金钱为 \(m_i\),所需时间为 \(t_i\)。现在 kkksc03 有 \(M\) 块钱,暑假时间为 \(T\),问在暑假期间他最多能满足多少个愿望。

思路分析

由于其除了增加一维外,其余底层逻辑为 0-1 背包类似,所以可以在 0-1 背包的基础上修改。

0-1 背包状态转移方程,其中 \(v_i\) 为体积,\(w_i\) 为价值。

\[dp_j=\max(dp_j,dp_{j-v_i}+w_i) \]

多维背包状态转移方程,其中把物品数量 \(1\) 作为价值。

\[dp_{j\color{red}{,k}}=\max(dp_{j\color{red}{,k}},dp_{j\color{red}{-m_i,k-t_i}}{\color{red}{+1}}) \]

代码呈现

#include<bits/stdc++.h>
using namespace std;

const int N=105,maxM=205;
int n,M,T;
int m[N],t[N],dp[maxM][maxM];

int main(){
    scanf("%d%d%d",&n,&M,&T);
    for (int i=1;i<=n;++i) scanf("%d%d",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);
        }
    }
    printf("%d",dp[M][T]);
    return 0;
}
posted @ 2025-12-23 19:10  CodingJuRuo  阅读(0)  评论(0)    收藏  举报