题目链接:https://www.luogu.org/problemnew/show/P1855
好迷的一道题啊,难道是逼着我用二维滚动数组???一开始写最简单的三维顺推只有60分,改成二维倒推就A了?好玄啊!
这道题思路很简单,类比01背包,不过是费用变成了二维的。
1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int mmax = 205; 7 8 int dp[mmax][mmax]; 9 10 int main() { 11 int n, m, t; 12 scanf("%d%d%d", &n, &m, &t); 13 for (int i = 1; i <= n; ++i) { 14 int nt, nm; 15 scanf("%d%d", &nt, &nm); 16 for (int j = m; j >= nm; --j) 17 for (int k = t; k >= nt; --k) 18 dp[j][k] = max(dp[j][k], dp[j - nm][k - nt] + 1); 19 } 20 printf("%d", dp[m][t]); 21 return 0; 22 }
然而可爱的我怎么可能会不知道哪里错了呢(后来才知道)?
我用三维的时候,金钱、时间都是从花费开始枚举的,这就导致金钱时间不足的情况都成了0,但是应该继承没满足的情况。二维背包自然不会出现这种问题。