洛谷 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;
}

浙公网安备 33010602011771号