dp 二维乃至多维背包

洛谷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 }
原文地址:https://www.cnblogs.com/qingjiuling/p/10142802.html