洛谷P1855 榨取kkksc03
分析:套路是很明显的01背包,但是这时受约束的变量有两个了,这种情况下就该用多维背包了
分析方法一样的,用dp[i][j][k]表示从前i个愿望中挑选总时间和总金钱不超过j,k时的最大愿望数。
则状态转移方程应该为:dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-tme[i]][k-mny[i]]+1).
因为多维数组,虽然这题数据量小,但是能用滚动数组就尽量用吧。
上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const double pi=acos(-1); 5 int tme[110],mny[110]; 6 int dp[250][250]; 7 int main(){ 8 int n,m,t;scanf("%d%d%d",&n,&m,&t); 9 for(int i=0;i<n;i++)scanf("%d%d",&tme[i],&mny[i]); 10 for(int i=0;i<n;i++){ 11 for(int j=t;j>=tme[i];j--){ 12 for(int k=m;k>=mny[i];k--){ 13 dp[j][k]=max(dp[j][k],dp[j-tme[i]][k-mny[i]]+1); 14 } 15 } 16 } 17 cout<<dp[t][m]<<endl; 18 return 0; 19 }